Python正在拆包原子w.r.t.中断吗



给定以下示例

try:
a, b = 0, 0
for _ in range(100):
a, b = (a+1, b+1)
except KeyboardInterrupt:
assert a == b

可以抛出AssertionError吗?如果是这样,是否有办法防止它,即确保每次迭代都更新ab,或者不更新?


可能与Python解包线程安全吗有关?

在中,给出了以下示例和相应的操作码:

>>> def t(self): a,b=20,20
... 
>>> dis.dis(t)
1           0 LOAD_CONST               2 ((20, 20))
3 UNPACK_SEQUENCE          2
6 STORE_FAST               1 (a)
9 STORE_FAST               2 (b)
12 LOAD_CONST               0 (None)
15 RETURN_VALUE        

由于有两个单独的指令用于存储ab,所以我希望不能保证这两个指令都在KeyboardInterrupt之前执行还是不执行。

您的直觉是正确的:而Python将在内部处理中断并单独重新公开它(因此中断不像C中那样令人担忧(,如PEP343:中所述

即使您编写了无错误的代码,KeyboardInterrupt异常仍然可能导致它在任意两个虚拟机操作码之间退出。

相关内容

  • 没有找到相关文章

最新更新