为了账号安全,请及时绑定邮箱和手机立即绑定

Python的dict.pop是原子的吗?

Python的dict.pop是原子的吗?

蛊毒传说 2021-03-31 21:14:43
相信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类型而言不是。



查看完整回答
反对 回复 2021-04-06
?
皈依舞

TA贡献1851条经验 获得超3个赞

实际上dict.pop()不是原子的。例如,如果您使用对象作为字典的键,Python必须调用对象的__hash __()实现。但是您可以使用dict.popitem()代替它,这确实是原子的。


查看完整回答
反对 回复 2021-04-06
  • 2 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信