来自流畅的python上记录的一道谜题
>>> t = (1, 2, [30, 40])
>>> t[2] += [50, 60]
到底会发生下面 4 种情况中的哪一种?
a. t 变成 (1, 2, [30, 40, 50, 60])。
b. 因为 tuple 不支持对它的元素赋值,所以会抛出 TypeError 异常。
c. 以上两个都不是。
d. a 和 b 都是对的。
正确答案:d
书中作者环境为3.4、2.7,我在3.7中测试的结果也同样是d
同样的,在使用extend为t[2]赋值时也是元祖改变,并未抛出异常
作者在其中的解释我的理解是元组末尾是一个可变对象,增量运算符并不是一个原子操作,所以我们在对t[2]赋值之后,再赋值给t的过程中它终于发现了,这玩意不能被改变啊,所以立刻抛出异常,由于不是原子操作的原因,t[2]已经被改变,同样的,如果我们使用的是t[2] = t[2] + [50,60]这种操作的时候,元组t并不会发生改变。
作者的三个教训:
1.不要把可变对象放在元祖里。
2.增量赋值不是一个原子操作。
3.学会python的字节码很有必要。