为什么+ = Python元组中的列表会引发TypeError但是仍然会修改列表?

时间:2012-05-01 11:37:29

标签: python

我刚看到一些非常奇怪的东西。

>>> t = ([],)
>>> t[0].append('hello')
>>> t
(['hello'],)
>>> t[0] += ['world']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(['hello', 'world'],)

为什么会引发TypeError并更改list内的tuple

2 个答案:

答案 0 :(得分:20)

当我开始在评论中提及时,+=实际上修改了列表就地,然后尝试将结果分配给元组中的第一个位置。来自data model documentation

  

调用这些方法来实现增强算术赋值(+ =, - =, =,/ =,// =,%=,* =,&lt;&lt; =,&gt; &gt; =,&amp; =,^ =,| =)。这些方法应该尝试就地执行操作(修改self)并返回结果(可能是,但不一定是自己)。

+=因此等同于:

t[0].extend(['world']);
t[0] = t[0];

因此,就地修改列表不是问题(1.步骤),因为列表是可变的,但是将结果返回给元组是无效的(2.步骤),而这就是抛出错误的地方。 / p>

答案 1 :(得分:8)