元组赋值谜题

来自流畅的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的字节码很有必要。

原文地址:https://www.cnblogs.com/slientbrain/p/10806818.html