如果d
是一个字典,那么显然CPython不喜欢它,如果另一个线程修改d而
[k for k in d]
评估。怎么样使用
list(d)
代替?这是线程安全的吗?
答案 0 :(得分:6)
我完全使用@ user2357112,这是一个实现细节,你不应该依赖它。但是为了回答这个问题:相关的list
和dict
方法是用C语言编写的,因此调用是单字节码操作,the code不直接释放GIL或据我所知,间接地说。因此,当前CPython中的 没有其他Python线程可以中断list
调用并修改d
。
请注意,如果list
已替换为其他内容,或d
不是用C编写的实际诚实dictobject
,则会出现此问题。另请注意“用C语言编写“不是一个充分条件,例如许多集合操作调用比较/散列方法,因此执行任意Python代码,允许释放GIL。