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

时间:2018-02-14 19:35:11

标签: python list global local pop

我在代码中遇到错误,在搜索后发现.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]

2 个答案:

答案 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变量所引用的对象。