元祖赋值谜题

Posted slientbrain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元祖赋值谜题相关的知识,希望对你有一定的参考价值。

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

以上是关于元祖赋值谜题的主要内容,如果未能解决你的问题,请参考以下文章

谜题10:八两

python多个变量赋值

元组拆包具名元祖

谜题9:半斤

谜题86:有毒的括号垃圾

谜题7:互换内容