元组赋值谜题

来自流畅的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值