我在代码中遇到错误,在搜索后发现.pop()函数在全局级别更改本地函数中的列表值,而不使用return函数或全局语句。我理解流行音乐的作用,我之前使用过它,但我不明白为什么它会影响全球列表的价值。这是为什么?有没有这个名称,还有其他功能吗?
#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]
答案 0 :(得分:1)
因为赋值不会在Python中创建任何对象的任何新副本。因此,当您将 global 列表作为参数传递给函数时,您将绑定到函数内的相同列表对象。
由于列表在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
答案 1 :(得分:1)
您对listname
变量引用的对象与listname
参数引用的对象进行了错误的区分。
listname
变量就像一个标签。它只是对列表对象[1, 2, 3, 4, 5]
的引用。 当您将listname
传递到checkpop
时,您为listname
参数提供了listname
变量引用的同一列表对象的引用 。这里的一点是, listname
变量和listname
参数指向同一个对象。因此,改变listname
参数引用的对象,也将更改全局listname
变量所引用的对象。