Python.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)

我在代码中遇到一个错误,搜索后发现.pop()函数在全局级别更改局部函数中的列表值,而不使用返回函数或全局语句。我了解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中生成任何对象的新副本。因此,当您将全局列表作为参数传递给函数时,您将绑定到函数内的相同列表对象

由于列表在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的作用相同。