关于+=的一个容易被忽略的问题

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.增量赋值并不是一个原子操作,就如同上面的例子所说,改动完成了但是也抛出了异常。

 

posted @ 2020-07-16 09:35  ColaIce  阅读(126)  评论(0)    收藏  举报