Python中的基本增量运算符有 += (__iadd__), *= (__imul__), -= (__isub__), /= (__itruediv__)
这里就以 += 做解释,其他的运行机制类似
a += b
背后的特殊方法就是 __iadd__
, 如果某个类没有使用该方法,则会退一步调用__add__
方法,a 实现了 __iadd__
方法,同时对可变的序列(list, btyearray, array.array)
来说,a
会就地改动,类似调用方法a.extend(b)
,但是如果 a 没有实现__iadd__
方法,则 a += b
就变得 先计算 a + b
, 得到一个新值,然后赋给a。 因此a会不会指向一个新的值,完全取决于a对应的类,是否实现了 __iadd__
方法。
一个关于 += 的谜题
一个谜题
下面代码运行,到底会出现下面4个选项中那种情况
t = (1, 2, [3, 4])
t[2] += [50, 60]
- a. t 会变成 (1, 2, [3, 4, 50, 60])
- b. 因为tuple不支持对他的元素赋值,因此会出现TypeError的错误提示
- c. a, b 两个都是错的
- d. a, b 两个都是对的
正确的答案是 d, 这里就是表达 增量运算符的非原子性。
可以通过dis.dis(t[2]+=[50, 60])查看他们的运行原理。
也可以通过可视化工具: Python运行原理可视化工具
查看他们的执行过程。