给定以下示例
try:
a, b = 0, 0
for _ in range(100):
a, b = (a+1, b+1)
except KeyboardInterrupt:
assert a == b
可以抛出AssertionError
吗?如果是这样,是否有办法防止它,即确保每次迭代都更新a
和b
,或者不更新?
可能与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
由于有两个单独的指令用于存储a
和b
,所以我希望不能保证这两个指令都在KeyboardInterrupt
之前执行还是不执行。
您的直觉是正确的:而Python将在内部处理中断并单独重新公开它(因此中断不像C中那样令人担忧(,如PEP343:中所述
即使您编写了无错误的代码,
KeyboardInterrupt
异常仍然可能导致它在任意两个虚拟机操作码之间退出。