的文档的Python 3.2的weakref模块WeakKeyDictionary,并WeakValueDictionary有一张纸条上遍历这些容器:
注意:注意:因为WeakKeyDictionary是在Python字典之上构建的,所以在迭代它时不能改变大小.这对于WeakKeyDictionary来说可能很难确保,因为程序在迭代期间执行的操作可能会导致字典中的项目"通过魔法"消失(作为垃圾收集的副作用).
作为这些容器行为的规范,这似乎相当可怕.特别是当运行使用CPython的垃圾收集器的代码(当使用包含循环的数据结构时)或使用另一个Python实现(例如Jython)时,听起来似乎没有安全的方法来迭代这些集合.
当垃圾收集器可以在程序中的任何位置清除引用时,如何安全地迭代这些集合?有一个CPython的解决方案是我的首要任务,但我也对其他实现的问题感兴趣.
这可能是一种迭代WeakKeyDictionary的安全方法吗?
import weakref
d = weakref.WeakKeyDictionary()
...
for k, v in list(d.items()):
...
Run Code Online (Sandbox Code Playgroud)