如何理解这个结果?

Rac*_*ely 5 python tuples

我是Python的新手.这是我对列表的一个问题:据说列表是可变的,元组是不可变的.但是当我写下面的内容时:

L1 = [1, 2, 3]
L2 = (L1, L1)
L1[1] = 5
print L2
Run Code Online (Sandbox Code Playgroud)

结果是

([1, 5, 3], [1, 5, 3])
Run Code Online (Sandbox Code Playgroud)

代替

([1, 2, 3], [1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

但是L2元组和元组是不可变的.为什么当我更改值时L1,值L2也会改变?

Dav*_*vid 7

从Python文档(http://docs.python.org/reference/datamodel.html),请注意:

包含对可变对象的引用的不可变容器对象的值可以在后者的值更改时更改; 但是容器仍然被认为是不可变的,因为它包含的对象集合无法更改.因此,不变性与具有不可改变的价值并不完全相同,它更加微妙.


Bre*_*arn 4

元组是不可变的,但元组内的列表是可变的。您更改了 L1(列表),而不是元组。该元组包含 L1 的两个副本,因此它们都显示更改,因为它们实际上是相同的列表。

如果一个对象是“不可变的”,这并不自动意味着它接触到的所有东西也是不可变的。您可以将可变对象放入不可变对象中,但这不会阻止您继续更改可变对象。