为什么更改变量值不会影响列表?

时间:2020-04-24 07:43:52

标签: python

我不明白为什么我的列表不更改变量值:

b = 3
a = [1, 2, b]
b = 10
print(a)

我打印时b的值仍为3。为什么不是10?

1 个答案:

答案 0 :(得分:0)

要深入了解这一点,您实际上必须学习C来创建python的编程语言以及指针的工作方式。

首先要注意的是,如果您写:

b = <stuff>
a = [1,2,b]
b = <other thing> 

然后无论如何,变量“ b”已被重新使用。创建“ a”时,无论您输入“ a”如何,都将保留在“ a”中。然后将“ b”更改为另一个值。 Python使用“ b”使之成为“ a”,但是python并不跟踪使用了变量“ b”,它仅保留了“ b”必须使之成为“ a”的值。

现在,如果“ b”是可变的(可以在不创建副本的情况下在内存中进行更新),并且不覆盖“ b”,而是对“ b”进行了突变。然后,“ a”将收到“ b”的突变;因为“ a”会将地址存储到“ b”,而不是“ b”的副本。例如,

b = [1,2,3]
a = [1,2,b]
print(a)
b.append(4)
print(a)

之所以发生这种情况,是因为“ b”不是一个不变的整数(只能复制),而是一个可变的列表(可以在内存中更新而不复制它)。然后,我们使用不复制列表的.append()对“ b”进行操作。这意味着“ a”收到的内存地址已更新,当您查看“ a”时,它将返回当前在该内存地址上的内容。

如果要检查python变量是否具有相同的内存地址,请使用python的“ is”内置函数。例如,

17 is 16+1
[1,2,3] is [1,2,3]

这表明python在内存中只有一个17(在任何时候都只有一个17),而17和16 + 1都指向同一个内存整数,这是一个不变的整数,在内存中仅存在一次。但是,创建的两个列表(即使它们看起来相同并且具有相同的编号)也被写入了两个不同的内存地址。