Python 2.6在特定情况下自动将函数定义中的变量全局化?为什么?



我被为什么会发生以下事情惊呆了:

这是我的代码:


def add_one(array):
    new_array = array
    length = len(array)
    for i in range(length):
        new_array[i] = new_array[i]+1

    return new_array
x = [1,2,3,4,5];
y = add_one(x)
print x
print y

结果如下:

[2, 3, 4, 5, 6]
[2, 3, 4, 5, 6]

我不明白为什么x变了。

我的推测:不知何故,x被作为函数add_one的全局变量。我包含了"new_array=array",这样,如果array是全局变量x,那么x就不会改变。然而,在执行"new_array=array"时,new_array也变成了全局变量x。我写了一个替代版本的函数add_one,它没有给我带来问题:


def add_one(array):
    new_array = []
    length = len(array)
    for i in range(length):
        new_array.append(array[i]+1)

似乎如果一个局部变量(即数组(在函数中由其索引编辑,它会相对于作为该函数输入的全局变量变为全局变量?

我不知道发生了什么事。任何解释都将不胜感激。

当您说new_array = array时,您不是在复制数组,而是在为数组创建另一个名称。两个名称仍然适用于同一个数组。

要进行复制,最简单的方法是使用切片:new_array = array[:]

对于模糊读取,没有任何东西是全局的。CCD_ 3仍然是一个完全正规的局部变量。但它是一个引用,因为Python中的所有内容(至少每个名称(都是引用:

  • add_one(x)将一个引用(不像C++中的引用,更像一个指针——如果其中任何一个对你来说都有意义的话(传递给xadd_one
  • new_array = array将只复制该引用
  • 没有复制发生,所有这些名称都指向同一个对象

这意味着在add_one中的array上调用一个方法修改了调用方的同一对象x,这意味着重新分配array(array = [](只会覆盖引用的本地副本,而不会影响引用同一对象的其他变量(毕竟,很可能没有这样的变量!(,但成员或项分配(例如new_array[i] = ...(基本上是一个方法调用,修改对象。

通常,从现有列表生成新列表的最简单方法是使用列表理解,对每个元素应用一些修改模式,并可选地进行一些过滤。CCD_ 14。

在第三行中,您将y设置为x。

new_array = array

这一行是至关重要的一行:

new_array = array

您必须将new_array视为变量(对象(的新名称,而不是一个新变量,该变量已命名为array

相关内容

  • 没有找到相关文章

最新更新