为何Python中用+=修改元组内列表时,列表改变却仍报错?
为什么元组内的列表用
+=操作后,明明报错却还是被修改了? 我们都知道Python里的tuple(元组)是不可变对象,创建后没法直接修改它的元素。比如直接赋值替换元组里的列表:
my_tuple = ([1],[2],[3]) my_tuple[2] = [3,4,5]
会直接报错:
TypeError: 'tuple' object does not support item assignment
但如果换成+=操作:
my_tuple = ([1],[2],[3]) my_tuple[2] += [4,5]
同样会抛出上面的TypeError,但打印my_tuple时却发现里面的列表已经变了:
print(my_tuple) # 输出: ([1], [2], [3, 4, 5])
核心原因:元组的“不可变”和+=的执行逻辑
- 元组的不可变,指的是元组本身存储的是元素的引用(内存地址),这些引用不能被修改——你不能把元组里的某个元素换成另一个对象,但如果这个引用指向的是可变对象(比如列表、字典),那这个可变对象本身的内容是可以修改的。
+=操作对于列表来说,本质是两步:- 先调用列表的
extend()方法,原地修改列表内容:这一步会直接把[4,5]加到my_tuple[2]指向的那个列表里,此时列表已经变成[3,4,5]了。 - 尝试把操作后的结果重新赋值给
my_tuple[2]:但元组不允许修改元素的引用,所以这一步会抛出TypeError。
- 先调用列表的
简单说就是:+=的原地修改先完成了,之后的赋值操作才触发报错,所以列表内容已经变了,但元组本身的元素引用没被替换(还是原来那个列表的地址)。
内容的提问来源于stack exchange,提问作者zoldxk
相关产品推荐
相关产品推荐

