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
变量所指的对象。
我在我的代码中遇到了一个错误,在搜索后发现 .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
变量所指的对象。