相信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
提交
取消