我在研究合并排序,我写了这段代码

def mergesort(a): #sorting algo
    #code is alright just confused about scope of variable
    if(len(a)>1):
        mid = len(a)//2
        l = a[:mid]
        r = a[mid:]
        mergesort(l)
        mergesort(r)
        i=j=k=0
        while(i<len(l) and j<len(r)):
            if(l[i]>r[j]):
                a[k] = r[j]
                j+=1
            else:
                a[k] = l[i]
                i+=1
            k+=1
        
        while(i<len(l)):
            a[k] = l[i]
            i+=1
            k+=1

        while(j<len(r)):
            a[k] = r[j]
            j+=1
            k+=1        

a = [30,2,4,5,-1,3,7,3,9,2,5]
mergesort(a)
print(a)

这里的a是一个全局变量,但是当函数参数名也是a时,函数作用域中的a不会覆盖全局作用域中的a吗?mergesort函数中的全局变量是如何编辑的?

我try 了另一个使用相同方法的代码,但这里的全局变量没有被编辑(如预期的那样),这与上面的代码有什么不同?

def foo(a):
    a=20

a = 10
foo(a)
print(a)

推荐答案

问题不在于a是全球性的(因为它不是全球性的).a对于函数来说是局部的,但它引用了与全局a相同的列表(因为变量在Python中是通过引用传递的).

在第一个例子中,a是一个列表(它是可变的),而在第二个例子中,a是一个整数(它是不变的).因此,更改列表的值inside(如a[k] = l[i])也会更改全局列表,而将引用更改为整数(如a = 20)仅替换本地引用.

如果您不希望该函数更改全局列表,可以通过创建列表的副本来修复它:

def mergesort(a):
    a = a[:] # or a = a.copy(), whichever you prefer
    ...

请注意,在本例中,该函数不起作用,因此您可能希望返回结果列表.

Python相关问答推荐

为什么自定义pytree aux_data对于jnp.数组来说在.jit()之后跟踪,而对于np.数组来说则不是?

Pandas使用过滤器映射多列

Polars Dataframe:如何按组删除交替行?

为什么dict(id=1,**{id:2})有时会引发KeyMessage:id而不是TypMessage?

遵循轮廓中对象方向的计算线

在函数内部使用eval(),将函数的输入作为字符串的一部分

在Python中对分层父/子列表进行排序

根据条件将新值添加到下面的行或下面新创建的行中

DataFrame groupby函数从列返回数组而不是值

将jit与numpy linSpace函数一起使用时出错

抓取rotowire MLB球员新闻并使用Python形成表格

Pandas 都是(),但有一个门槛

如何使用它?

如果条件不满足,我如何获得掩码的第一个索引并获得None?

如何在WSL2中更新Python到最新版本(3.12.2)?

我如何根据前一个连续数字改变一串数字?

如何从需要点击/切换的网页中提取表格?

如何在TensorFlow中分类多个类

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

(Python/Pandas)基于列中非缺失值的子集DataFrame