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

2024-06-25 22:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

#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]


Tags: 函数代码列表return错误局部语句级别
2条回答

因为在Python中赋值不会生成任何对象的任何新副本。因此,当您将全局列表作为参数传递给函数时,您将绑定到函数内部的同一个list对象。在

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

为了更好地理解,您可以随时检查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变量类似于标记。它只是对list对象[1, 2, 3, 4, 5]的引用。当您将listname传递到checkpop中时,您给了listname参数一个对同一个列表对象的引用,listname变量引用了。这里的重点是listname变量和listname参数指向同一个对象。因此,改变listname参数所指的对象,也会改变全局listname变量所指的对象。在

相关问题 更多 >