teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ちょっと補足

2015/12/06 11:07

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -7,6 +7,7 @@
7
7
  gc: collectable <list 0x10992a408>
8
8
  gc: collectable <dict 0x1097f5508>
9
9
  ```
10
- <A ...>は`A()`によって作られたAクラスのオブジェクト、<list ...>は`[A()]`によって作られたリスト(list)です。最後の<dict ...>なのですが、`test[0]`であるAクラスのオブジェクトの`__dict__`の実体である辞書(dict)のようです。delの前に`print(hex(id(test[0].__dict__)))`を挿入して、同じオブジェクトIDであることを確認しています。
10
+ <A ...>は`A()`によって作られたAクラスのオブジェクト、<list ...>は`[A()]`によって作られたリスト(list)です。最後の<dict ...>なのですが、`test[0]`であるAクラスのオブジェクトの`__dict__`の実体である辞書(dict)のようです。delの前に`print(hex(id(test[0].__dict__)))`を挿入して、同じオブジェクトIDであることを確認しています。
11
+ ※ この辞書には{'test': [<Aのオブジェクト>]}という感じで自己参照したものが保存されています。
11
12
 
12
13
  この`__dict__`ですがちょっと面白い動きをするようです。色々試してみると、オブジェクトに任意の名前で代入したとき、つまり`__dict__`に中身があるような状態にしたときのみ、この<dict ...>が回収リストに出てきます。必要にされたときに、初めて自動的に作成される仮想的な辞書のようです。Pythonのソースコードを見ればもう少し詳しくわかるかも知れません。