a=(1,2,[3,4])
a[2]+=[5,6]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-5b2f2dd8179c> in <module>
1 a=(1,2,[3,4])
2
----> 3 a[2]+=[5,6]
TypeError: 'tuple' object does not support item assignment
但实际上a还是完成了增量赋值!
我们使用dis来查看 a[2]+=[5,6]
的背后逻辑
import dis
dis.dis('a[2]+=[5,6]')
1 0 LOAD_NAME 0 (a)
2 LOAD_CONST 0 (2)
4 DUP_TOP_TWO
6 BINARY_SUBSCR
8 LOAD_CONST 1 (5)
10 LOAD_CONST 2 (6)
12 BUILD_LIST 2
14 INPLACE_ADD
16 ROT_THREE
18 STORE_SUBSCR
20 LOAD_CONST 3 (None)
22 RETURN_VALUE
其中,第6正常完成
但18失败了,无法赋值,因为这是一个重新赋值的语句,但a又是一个不可变的元组,所以失败了
元组的相对不可变性
我们上面的a是不可变的元组,但是a[2]是可变的对象
所以,元组的不可变性到底是指什么呢?
这其实是指tuple数据结构的物理内容,即保存的引用不可变,与引用的对象无关。
元素依然可变,但是元组本身不会变,他不可变的是元素的标识!
简单来说,就是元素的id是不会变的。