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)
看来,如果局部变量(即数组)由函数中的索引编辑,相对于该函数的输入而言,它是否变为全局变量? 我不知道发生了什么。任何解释将不胜感激。     
已邀请:
晦涩难懂的读书没有什么成为全球性的。
array
仍然是完全正常的局部变量。但这是一个参考,因为Python中的所有内容(至少每个名称)都是参考:
add_one(x)
将引用(不像C ++中的引用,更像是指针-如果这对您来说意味着任何东西)传递给
x
add_one
new_array = array
只会复制该参考 没有复制发生,所有这些名称都指向同一个对象! 这意味着在
add_one
中的
array
上调用方法会修改调用者的同一个对象ѭ5refers所指-重新分配
array
array = []
)只会覆盖引用的本地副本,而不会影响引用同一对象的其他变量(之后总的来说,很可能没有这样的变量!),但是成员或项目分配(例如
new_array[i] = ...
)基本上是一个方法调用,它将修改对象。 通常,从现有列表生成新列表的最简单方法是对列表元素进行某种修改,并可选地进行某些过滤。在此示例中为ѭ14。     
当您说“ 7”时,您不是在复制数组,而是在为数组命名。这两个名称仍适用于同一阵列。 制作副本最简单的方法是使用切片:
new_array = array[:]
    
在第三行,将y设置为x。
new_array = array
    
这条线很关键:
new_array = array
您必须看到的不是“ 19”作为新变量,而是作为已经具有名称“ 3”的变量(对象)的新名称。     

要回复问题请先登录注册