记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错
记录一个python里面很神奇的操作 今天记录一个很神奇的操作。关于序列的增量赋值。如果你很熟悉增量赋值,你也不妨看下去,我想说的是有关于增量赋值和元组之间一种神奇的操作。来自 《流畅的Python》 一书,让我们更加深入地了解里面的原理 神奇的操作 >>>t = (1,2,[30,40]) >>>t[2] += [50,60] 上面这段代码会出现什么样的情况 a. t会变成(1,2,[30,40,50,60]) b. 因为tuple不支持对它的元素赋值,所以会抛出TypeError异常 c. 以上两个都不是 d. a和b都是对的 大多数人都会认为b是正确的,本书的作者也是这么认为的,但是实际上呢?却是选 b 不要疑惑,就是这样,既报错,又成功进行了修改 首先讲一下增量赋值 我们使用增量赋值运算符 += 和 *= 等增量赋值运算符的时候(用 += 举例),使用的是背后的特殊方法 __iadd__ ,如果没有实现这个方法则会退而求其次,使用 __add__ . 两者的区别是什么? 用列表举例 a+=b ,使用 __add__ 的话就像是使用了 a.extend(b) ,如果使用 __add__ 的话,则是 a = a+b ,前者是直接在原列表上进行扩展,而后者是先从原列表中取出值,在一个新的列表中进行扩展,然后再将新的列表对象返回给变量,显然后者的消耗要大些。 继续将那个神奇的操作