我在代码中遇到了一个错误,搜索后发现.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]
因为在Python中赋值不会生成任何对象的任何新副本。因此,当您将全局列表作为参数传递给函数时,您将绑定到函数内部的同一个list对象。在
由于列表在Python中是可变的,当您在其中执行就地操作时,您正在更改相同的globallist对象。在
为了更好地理解,您可以随时检查
id
:你在
listname
变量引用的对象和listname
参数引用的对象之间做了错误的区分。在listname
变量类似于标记。它只是对list对象[1, 2, 3, 4, 5]
的引用。当您将listname
传递到checkpop
中时,您给了listname
参数一个对同一个列表对象的引用,listname
变量引用了。这里的重点是listname
变量和listname
参数指向同一个对象。因此,改变listname
参数所指的对象,也会改变全局listname
变量所指的对象。在相关问题 更多 >
编程相关推荐