Python的dict.pop是原子的吗?

相信dict.pop原子操作是合理的,因为KeyError如果缺少指定的键并且没有提供默认值,它将引发原子操作,如下所示:

d.pop(k)

但是,文档似乎没有专门针对这一点,至少在专门文档部分中没有dict.pop

在我审查使用这种模式的我的答案时,我想到了这个问题:

if k in d: del d[k]

当时,我没有想到在期间可能会存在密钥的潜在条件if,但在时却没有del。如果dict.pop确实提供了原子替代方法,那么我应该在回答中指出这一点。


蛊毒传说
浏览 239回答 2
2回答

慕森王

对于默认类型,dict.pop()是C函数调用,这意味着它以一个字节码求值执行。这使该调用成为原子操作。Python线程仅在字节码评估循环允许它们切换时切换,因此在字节码边界切换。某些Python C函数确实会回调Python代码(请考虑__dunder__特殊的方法钩子),但该dict.pop()方法没有,至少对于默认dict类型而言不是。

皈依舞

实际上dict.pop()不是原子的。例如,如果您使用对象作为字典的键,Python必须调用对象的__hash __()实现。但是您可以使用dict.popitem()代替它,这确实是原子的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python