Python中tuple执行t[0]+=[2]报错但列表更新的问题问询
元组中列表执行
+=操作的怪异行为解析 先还原你遇到的代码场景:
>>> t = ([1],) >>> t[0] [1] >>> t[0] += [2] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t[0] [1, 2]
下面针对你的两个问题逐一解答:
1. 为什么执行t[0] += [2]会触发TypeError?
要搞懂这个问题,得拆解+=操作在Python里的执行逻辑:
- 对于列表来说,
a += b本质是调用列表的__iadd__方法,这个方法会原地修改列表本身,然后返回修改后的列表对象。 - 当你对元组的元素执行
t[0] += [2]时,整个操作分两步走:- 先获取
t[0]对应的列表对象,调用它的__iadd__([2])方法,完成列表的原地修改。 - 尝试把
__iadd__返回的列表对象重新赋值给t[0]的位置——但元组是不可变类型,它的元素指向是不允许被修改的,这一步就触发了TypeError。
- 先获取
简单说,+=不是原子操作,错误是在第二步赋值时抛出的。
2. 既然赋值操作失败,为什么列表内容仍被更新?
核心原因是:错误抛出前,列表的修改已经完成了。
列表是可变类型,它的内容可以被直接修改,和它是否作为元组的元素无关。t[0] += [2]的第一步已经通过__iadd__把列表[1]原地改成了[1,2],这个修改是直接作用在列表对象上的,等这一步完成后才执行到给元组元素赋值的步骤,此时报错但已经无法回滚之前的列表修改,所以你再查看t[0]时会看到更新后的结果。
内容的提问来源于stack exchange,提问作者Matias Cicero
相关产品推荐
相关产品推荐

