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

为什么+;=Python元组中的列表是否会引发TypeError,但是否仍要修改列表?,python,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

我只是遇到了一些很奇怪的事情

>>> 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'],)
>t=([],)
>>>t[0]。追加('hello')
>>>t
([“你好”],)
>>>t[0]+=['world']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“tuple”对象不支持项分配
>>>t
([“你好”,“世界”],)

为什么它会引发
TypeError
,却更改
元组中的
列表

正如我在评论中开始提到的,
+=
实际上修改了列表,然后尝试将结果分配到元组中的第一个位置。从:

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

因此,
+=
相当于:

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

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

这是打开的。

我想您必须看看
+=
是如何实际实现的。看起来它实际上并没有创建一个新的列表,而是在适当的位置更改列表,这就是
+
部分。然后你有了赋值,但由于元组是不可变的,这是不允许的。@FelixKling+=的工作原理类似于append(),即列表的id()保持不变。还要注意,要能够散列元组,它的所有组成部分也必须是可散列的。这在中,有一个很好的解释。还有一个解释了为什么它不是一个bug。只是澄清一下,现有列表确实与RHS的列表连接在一起,但是对元组的赋值失败了,但是它对列表对象的引用仍然保持不变。这就是为什么你会看到列表被更新,元组会引发一个
TypeError
。明白了。现在有道理了。谢谢。@Felix Kling,但即使在+=之后,列表的id()仍然保持不变,但是如果我们这样修改列表,列表的id()会发生变化,例如x[0]=x[0]+['list'],其中x是列表列表。@Ashwini:只有
+=
应该修改列表(没有新列表)。如果您有普通的
+
操作符,那么实现很可能会返回类的新实例(新列表)。试试
x[0]+=['list']
。或者你的观点是什么?我不确定我是否理解。+1@FelixKling我理解你的意思。