Python .pop() 全局更改本地列表?

Python .pop() changes local list globally?

我在我的代码中遇到了一个错误,在搜索后发现 .pop() 函数在全局级别更改了局部函数中的列表值,而没有使用 return 函数或全局语句。我了解 pop 的作用,我以前使用过它,但我不明白为什么它会影响全局列表的价值。这是为什么?是否有此名称,是否有其他功能相同?

#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 中创建任何对象的任何新副本。因此,当您将 global 列表作为参数传递给函数时,您将绑定到函数内部的同一个列表对象。

由于列表在 Python 中是可变的,当您在其中执行就地操作时,您正在更改相同的 global 列表对象。

为了更好地掌握,您可以随时查看 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 参数 [=32] 引用的对象之间做出了错误的区分=]指的是.

listname变量就像一个标签。它只是对列表对象 [1, 2, 3, 4, 5] 的引用。 当您将 listname 传递给 checkpop 时,您为 listname 参数提供了对 listname 变量所引用的同一列表对象的引用。这里的重点是 listname 变量和 listname 参数指向同一个对象 。因此,改变 listname 参数所指的对象, 也将 更改全局 listname 变量所指的对象。