zig*_*igg 12 python dictionary
认为以dict.pop原子方式运行似乎是合理的,因为KeyError如果指定的键丢失并且没有提供默认值则会引发,如下所示:
d.pop(k)
Run Code Online (Sandbox Code Playgroud)
但是,文档似乎并没有专门针对这一点,至少在专门记录的部分没有dict.pop.
if k in d: del d[k]
Run Code Online (Sandbox Code Playgroud)
那时候,我并没有想到一把钥匙可能存在的潜在条件if,而不是当时del.如果dict.pop确实提供了原子替代方案,那么我应该在我的答案中注意到.
Mar*_*ers 26
对于默认类型,dict.pop()是C函数调用,这意味着它是通过一个字节码评估执行的.这使得该调用原子化.
Python线程仅在字节码评估循环允许时才切换,因此在字节码边界处.一些Python C函数会回调到Python代码(想想__dunder__特殊方法钩子),但该dict.pop()方法不会,至少不是默认dict类型.
实际上 dict.pop() 不是原子的。例如,如果您使用对象作为字典的键,Python 必须调用对象的 __hash__() 实现。但是你可以使用 dict.popitem() 来代替,它是真正的原子性的。