Python的`list(some_dictionary)`是线程安全的吗?

Car*_*n S 2 python python-multithreading python-2.7

如果d是字典,那么显然CPython不喜欢它,如果另一个线程修改d

[k for k in d]
Run Code Online (Sandbox Code Playgroud)

被评估.如何使用

list(d)
Run Code Online (Sandbox Code Playgroud)

代替?这是线程安全的吗?

小智 6

我完全使用@ user2357112,这是一个实现细节,你不应该依赖它.但是为了回答这个问题:相关listdict方法是用C语言编写的,因此调用是一个单字节码操作,并且代码不会直接或间接地释放GIL,据我所知.因此在当前的CPython中没有其他Python线程可以中断list调用和修改d.

请注意,如果其中任何一个list已被其他内容替换,或者d不是dictobject用C编写的实际的诚实上帝,则会发生故障.另请注意,"用C语写"并不是一个充分条件,例如许多集合操作调用比较/散列方法因此执行任意Python代码,允许释放GIL.