相信dict.pop原子操作是合理的,因为KeyError如果缺少指定的键并且没有提供默认值,它将引发原子操作,如下所示:d.pop(k)但是,文档似乎没有专门针对这一点,至少在专门文档部分中没有dict.pop。在我审查使用这种模式的我的答案时,我想到了这个问题:if k in d: del d[k]当时,我没有想到在期间可能会存在密钥的潜在条件if,但在时却没有del。如果dict.pop确实提供了原子替代方法,那么我应该在回答中指出这一点。
2 回答
慕森王
TA贡献1777条经验 获得超3个赞
对于默认类型,dict.pop()
是C函数调用,这意味着它以一个字节码求值执行。这使该调用成为原子操作。
Python线程仅在字节码评估循环允许它们切换时切换,因此在字节码边界切换。某些Python C函数确实会回调Python代码(请考虑__dunder__
特殊的方法钩子),但该dict.pop()
方法没有,至少对于默认dict
类型而言不是。
皈依舞
TA贡献1851条经验 获得超3个赞
实际上dict.pop()不是原子的。例如,如果您使用对象作为字典的键,Python必须调用对象的__hash __()实现。但是您可以使用dict.popitem()代替它,这确实是原子的。
添加回答
举报
0/150
提交
取消