为什么在Python中具有相同值的可变对象具有不同的id
感谢您的宝贵时间,我刚刚开始学习Python。我遇到了可变和不可变的对象。 据我所知,可变对象可以在创建后更改为什么在Python中具有相同值的可变对象具有不同的id,python,Python,感谢您的宝贵时间,我刚刚开始学习Python。我遇到了可变和不可变的对象。 据我所知,可变对象可以在创建后更改 a = [1,2,3] print(id(a)) 45809352 a = [3,2,1] print(id(a)) 52402312 那么为什么同一列表“a”的id在其值更改时会更改。您的解释不正确 将新的列表分配给a时,会更改其引用 另一方面,你可以做: a[:] = [3,2,1] 然后引用将不会更改。可变表示对象的内容已更改。例如,a.append(4)实际上使a等于[1,
a = [1,2,3]
print(id(a))
45809352
a = [3,2,1]
print(id(a))
52402312
那么为什么同一列表“a”的id在其值更改时会更改。您的解释不正确 将新的
列表
分配给a
时,会更改其引用
另一方面,你可以做:
a[:] = [3,2,1]
然后引用将不会更改。可变表示对象的内容已更改。例如,a.append(4)
实际上使a
等于[1,2,3,4]
,而相反,追加到字符串(不可变)不会改变它,而是创建一个新的字符串
但是,当您重新指定时,您将创建一个新对象并将其指定给
a
,您不会更改a
的现有内容。以前的内容将丢失(除非被其他变量引用)如果更改列表,其id不会更改。但是你可以做一些事情来创建一个新的列表,然后它也会有一个新的id
例如:
当你这样做的时候
a = [3, 2, 1]
a
取消[1,2,3]列表的链接变量
不可变并不意味着您分配了一个新对象,它意味着您的原始对象可以“就地”更改,例如通过
.append()
任务不是变异。可能是@Kevin的重复。谢谢。现在我理解了变异的概念。你把它与“追加到字符串”相比不是很好,因为字符串没有
append
方法。您只能执行string+“foo”
,这将创建一个新字符串,但[1,2,3]+[4]
也是如此str.replace
可能是一个更好的例子。@tobias_k:好的,不是字面意思,只是想传达这个想法。在其他语言中有一个append,但它的主要思想仍然是创建一个新对象
a = [3, 2, 1]
>>> 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