【发布时间】:2017-02-01 04:14:42
【问题描述】:
灵感来自阅读footnote 4 of this article。
考虑以下场景:
>>> t = (1,2, [3, 4])
>>> t[2] += [5,6]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
t[2] += [5,6]
TypeError: 'tuple' object does not support item assignment
元组是不可变的。因此,正如预期的那样,尝试添加到元组内的列表会引发错误。
但是,如果我们检查我们的元组,列表已添加到! (我可以想象这会导致很难追踪错误)
>>> t
(1, 2, [3, 4, 5, 6])
另外,两者都在扩展
>>> t[2].extend([7,8])
>>> t
(1, 2, [3, 4, 5, 6, 7, 8])
和附加
>>> t[2].append(9)
>>> t
(1, 2, [3, 4, 5, 6, 7, 8, 9])
工作不会引发错误。
所以,我的问题是:
- 如果元组是不可变的,为什么可以更改元组中的列表?
- 为什么第一个示例会引发错误,而其他两个则不会?
- 在第一个示例中,为什么即使引发错误,元组内的列表也会更改?
【问题讨论】:
-
来自docs:包含对可变对象的引用的不可变容器对象的值可以随着后者的值改变而改变;但是容器仍然被认为是不可变的,因为它包含的对象集合不能更改。因此,不变性与具有不可更改的值并不严格相同,它更微妙。
-
查看相关documentation page。
-
对于 1. 参见:“为什么元组可以包含可变项?” stackoverflow.com/questions/9755990/…