Python.pop()全局更改本地列表?
我在代码中遇到一个错误,搜索后发现.pop()函数在全局级别更改局部函数中的列表值,而不使用返回函数或全局语句。我了解pop的作用,我以前使用过它,但我不明白它为什么会影响列表的全局值。为什么呢?这个函数有名字吗?还有其他函数也有名字吗Python.pop()全局更改本地列表?,python,list,global,local,Python,List,Global,Local,我在代码中遇到一个错误,搜索后发现.pop()函数在全局级别更改局部函数中的列表值,而不使用返回函数或全局语句。我了解pop的作用,我以前使用过它,但我不明白它为什么会影响列表的全局值。为什么呢?这个函数有名字吗?还有其他函数也有名字吗 #Example code listname=[1,2,3,4,5] def checkpop(listname): popped = listname.pop() listname = ['WTF'] print (listname)
#Example code
listname=[1,2,3,4,5]
def checkpop(listname):
popped = listname.pop()
listname = ['WTF']
print (listname)
print(listname)
checkpop(listname)
print(listname)
输出
[1,2,3,4,5]
['WTF']
[1,2,3,4]因为赋值不会在Python中生成任何对象的新副本。因此,当您将全局列表作为参数传递给函数时,您将绑定到函数内的相同列表对象 由于列表在Python中是可变的,当您在其中执行就地操作时,您正在更改相同的全局列表对象 为了更好地掌握,您可以随时检查
id
:
In [45]: lst = [1, 2]
In [46]: def foo(lst):
...: print(id(lst))
...: return
In [47]: id(lst)
Out[47]: 139934470146568
In [48]: foo(lst)
139934470146568
在
listname
变量引用的对象和listname
参数引用的对象之间进行错误区分
listname
变量类似于标记。它只是对列表对象的引用[1,2,3,4,5]
当您将listname
传递到checkpop
中时,您为listname
参数提供了对listname
变量引用的同一列表对象的引用。这里的要点是listname
变量和listname
参数指向同一个对象。因此,改变listname
参数所指的对象,也会改变全局listname
变量所指的对象。这是预期的行为。这绝对不是WTF。它应该在适当的地方改变列表。如果您想获取列表的最后一个元素,请使用popped=listname[-1],而不是“本地列表”。存在局部变量,但它们引用的对象未附加到任何变量或作用域。该对象既不是局部的,也不是全局的。变量是。局部变量引用与全局变量相同的对象。对本地引用的对象的任何修改对全局引用仍然可见。所以所有的列表变异方法都是这样工作的,例如,list.append
,list.extend
,list.clear
,list.sort
,等等@BeatrixKidco查看这篇关于python变量的优秀博文:是的,一个例子是个好主意。不过,您可以使用is
,因为它与比较id
s的作用相同。