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()):
...