16

我刚刚遇到了一件很奇怪的事情。

>>> 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

4

2 回答 2

20

正如我在评论中开始提到的那样,+=实际上就地修改了列表,然后尝试将结果分配给元组中的第一个位置。从数据模型文档

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

+=因此等价于:

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

所以就地修改列表不是问题(1.步骤),因为列表是可变的,但是将结果分配回元组是无效的(2.步骤),这就是引发错误的地方。

于 2012-05-01T11:46:38.353 回答
8

这是在http://bugs.python.org/issue11562上。

于 2012-05-01T11:56:16.017 回答