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是不会变的。

Last modification:February 20, 2022
如果觉得我的内容对你有用,请随意赞赏