Loading... ```python 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] `的背后逻辑 ```python import dis dis.dis('a[2]+=[5,6]') ``` ```python 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 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 1 如果觉得我的内容对你有用,请随意赞赏