一尘不染

为什么Python元组中列表的+ =会引发TypeError但无论如何都会修改列表?

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


阅读 148

收藏
2020-12-20

共1个答案

一尘不染

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

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

+= 因此等于:

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

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

2020-12-20