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)
看来,如果局部变量(即数组)由函数中的索引编辑,相对于该函数的输入而言,它是否变为全局变量?
我不知道发生了什么。任何解释将不胜感激。
没有找到相关结果
已邀请:
4 个回复
舜辉
仍然是完全正常的局部变量。但这是一个参考,因为Python中的所有内容(至少每个名称)都是参考:
将引用(不像C ++中的引用,更像是指针-如果这对您来说意味着任何东西)传递给
到
只会复制该参考 没有复制发生,所有这些名称都指向同一个对象! 这意味着在
中的
上调用方法会修改调用者的同一个对象ѭ5refers所指-重新分配
(
)只会覆盖引用的本地副本,而不会影响引用同一对象的其他变量(之后总的来说,很可能没有这样的变量!),但是成员或项目分配(例如
)基本上是一个方法调用,它将修改对象。 通常,从现有列表生成新列表的最简单方法是对列表元素进行某种修改,并可选地进行某些过滤。在此示例中为ѭ14。
骂狮淋唐便
街茬
量华
您必须看到的不是“ 19”作为新变量,而是作为已经具有名称“ 3”的变量(对象)的新名称。