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

sat*_*ran 16 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'],)
Run Code Online (Sandbox Code Playgroud)

为什么它会提升TypeError并改变list内部tuple

Fel*_*ing 20

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

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

+= 因此相当于:

t[0].extend(['world']);
t[0] = t[0];
Run Code Online (Sandbox Code Playgroud)

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

  • 只是为了澄清,现有的列表确实与RHS的列表连接在一起,但是对元组的赋值失败了,但它对列表对象的引用仍然保持不变.这就是为什么你看到更新列表和元组引发`TypeError`的原因. (2认同)