关于+=的一个容易被忽略的问题
a = (0,1,2,3,[0,1,2],5)
a[4] += [3]
在一般来说,所有的使用者都知道元组一旦被创建就不可更改,除非用一个新的元组来覆盖它,但是上面的示例有了不同的反馈。
运行之后得到了异常:TypeError: 'tuple' object does not support item assignment
在这个时候查看a的值会发现a被改动了:
>>> a
(0, 1, 2, 3, [1, 2, 3], 5)
而且在修改的前后,a的ID并没有发生变化。那么这个增量赋值操作是怎么被完成的??
在查阅了Fluent Python后得到了这个解释,在修改时,s[a]的值被传入栈的顶端,此时s[a]的修改可以被完成,因为顶端指向了可变的对象。随后s[a] = Top报错,因为s是一个不可变的元组。(查看字节码)
但是在使用extend就可以避免报错。a[4].extend([4])就可以顺利完成操作。
此后得到了两个经验:
1.元组中不要存放可变的对象,以免以后发生预料不到的问题。
2.增量赋值并不是一个原子操作,就如同上面的例子所说,改动完成了但是也抛出了异常。

浙公网安备 33010602011771号