Python 增量运算符是非原子操作

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运行原理可视化工具
查看他们的执行过程。

你可能感兴趣的:(Python 增量运算符是非原子操作)