令人费解的"'元组'对象不支持项目分配"错误

kjo*_*kjo 11 python

考虑以下:

>>> t = ([],)
>>> t[0].extend([12, 34])
>>> t
([12, 34],)
>>> t[0] += [56, 78]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
([12, 34, 56, 78],)
>>> 
Run Code Online (Sandbox Code Playgroud)

我知道元组是不可变的,但LHS中的项目不是元组! (事实上​​,预期的分配成功,尽管有错误信息,但整个场景只会更奇怪.)

为什么这种行为不被视为错误?

Joc*_*zel 8

t[0] += [56, 78]
Run Code Online (Sandbox Code Playgroud)

是的缩写

t[0] = t[0].__iadd__([56, 78])
Run Code Online (Sandbox Code Playgroud)

哪里t是元组.该t[0].__iadd__([56, 78])部分更改列表,但结果不能存储为t[0].

Python中的LHS始终是一个名称,而不是一个值.在每个Python表达式中,RHS被评估为一个值并分配给LHS上的名称.在这种情况下,名称t[0]无法分配,因为它t是一个元组.