为什么具有相同值的可变对象在Python中具有不同的id

时间:2017-01-31 14:40:19

标签: python

感谢您宝贵的时间,我刚开始学习Python。我遇到了Mutable和Immutable对象。 据我所知,可变对象在创建后可以更改。

a = [1,2,3]
print(id(a))
45809352
a = [3,2,1]
print(id(a))
52402312

那么为什么同一个列表的ID" a"更改其值时会更改。

5 个答案:

答案 0 :(得分:5)

你的解释是不正确的。

当您将新list分配给a时,您可以更改其引用。

另一方面,你可以这样做:

a[:] = [3,2,1]

然后引用不会改变。

答案 1 :(得分:1)

mutable 表示对象的内容已更改。例如a.append(4)实际上使a等于[1, 2, 3, 4],而相反,追加到字符串(不可变)不会改变它,它会创建一个新的。{/ p >

但是,当您重新分配时,您创建了一个新对象并将其分配给a,您不会改变a的现有内容。之前的内容丢失(除非被其他变量引用)

答案 2 :(得分:0)

如果更改列表,则其ID不会更改。但是你可以做一些事情而不是创建一个新的列表,然后它也会有一个新的id。

如,

>>> l=[]
>>> id(l)
140228658969920
>>> l.append(3)  # Changes l
>>> l
[3]
>>> id(l)
140228658969920  # Same ID
>>> l = l + [4]  # Computes a new list that is the result of l + [4], assigns that
>>> l
[3, 4]
>>> id(l)
140228658977608  # ID changed

答案 3 :(得分:0)

当你这样做时

a = [3, 2, 1]
  1. 您取消[1,2,3]列表与变量a的链接。
  2. 创建新列表[3,2,1],然后将其分配给a变量。

答案 4 :(得分:0)

不可变并不意味着你分配一个新对象,这意味着你的原始对象可以“就地”改变,例如通过.append()

>>> my_list = [1,2,3]
>>> id(my_list)
140532335329544
>>> my_list.append(5)
>>> id(my_list)
140532335329544
>>> my_list[3] = 4
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
140532335329544