我有这个片段:
a = [1,2,3]
b = a
b = [4,5,6] # a doesnt change
还有这个:
a = [1,2,3]
b = a
b[0] = 5 # a also changes
怎么样b
的初始化在决定 a
的可变性方面发挥了作用?
最佳答案
当您创建列表并将其分配给变量时,例如
a = [1, 2, 3]
您创建一个对象,变量 a 保存对该对象的引用。当你这样做时
b = a
您在 b 中分配了相同的引用,因此现在 a 和 b 都指向您的列表。所以当你执行
b[0] = 5
您更改同一个列表。
您可以使用 id() 函数来查看此操作,该函数返回对象的内存地址:
>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140454191340720, 140454191340720)
它们是相同的。重点是,a 和 b 本身并不是列表,它们指向一个列表。
当你做类似的事情时:
a = [1, 2, 3]
b = a
b = [2, 3, 4]
您首先向 b 分配了对 a 所指向的列表的引用,然后又为其分配了新的引用。
顺便说一下,当你做类似的事情时,这可能会在你背后咬你一口
def foo (a=[]):
a.append(42)
return a
由于参数 a 在每次调用时都指向同一个列表,因此如果您在不带参数的情况下调用此函数 5 次,则列表将包含 5x 42:
foo(); foo(); foo(); foo();
print(foo())
>>> [42, 42, 42, 42]
关于python - 理解 Python 中的可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16731404/