python - 理解 Python 中的可变性

标签 python mutability

我有这个片段:

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/

相关文章:

go - 我不能改变这个结构我也不明白为什么

python - 如何使用 xlrd、Python 定位和访问命名范围(全局、每个工作表)?

python,使用if循环确保用户输入是数字然后操作数字

rust - 与可变借用相关的不可变借用导致 "cannot borrow ` *self` 一次多次可变”

Swift 可变数组参数

rust - 内部可变性如何影响缓存行为?

python - 如何避免按索引对数据透视表进行排序

python - Python中的openCV光流

python - 创建具有连续整数但忽略特定数字的 numpy 数组的最快方法

java - 操作整数对象而不创建新实例?