私は非常に複雑なクラスを持っています:
class C:
pass
そして、私はこのテストコードを持っています:
for j in range(10):
c = C()
print c
これは:
<__main__.C instance at 0x7f7336a6cb00>
<__main__.C instance at 0x7f7336a6cab8>
<__main__.C instance at 0x7f7336a6cb00>
<__main__.C instance at 0x7f7336a6cab8>
<__main__.C instance at 0x7f7336a6cb00>
<__main__.C instance at 0x7f7336a6cab8>
<__main__.C instance at 0x7f7336a6cb00>
<__main__.C instance at 0x7f7336a6cab8>
<__main__.C instance at 0x7f7336a6cb00>
<__main__.C instance at 0x7f7336a6cab8>
Pythonが2つの異なる値に切り替わることが簡単にわかります。場合によっては、これは壊滅的である可能性があります(たとえば、オブジェクトを他の複雑なオブジェクトに格納する場合)。
ここで、オブジェクトをリストに格納すると、次のようになります。
lst = []
for j in range(10):
c = C()
lst.append(c)
print c
私はこれを手に入れます:
<__main__.C instance at 0x7fd8f8f7eb00>
<__main__.C instance at 0x7fd8f8f7eab8>
<__main__.C instance at 0x7fd8f8f7eb48>
<__main__.C instance at 0x7fd8f8f7eb90>
<__main__.C instance at 0x7fd8f8f7ebd8>
<__main__.C instance at 0x7fd8f8f7ec20>
<__main__.C instance at 0x7fd8f8f7ec68>
<__main__.C instance at 0x7fd8f8f7ecb0>
<__main__.C instance at 0x7fd8f8f7ecf8>
<__main__.C instance at 0x7fd8f8f7ed40>
これはケースを解決します。
だから今、私は質問をしなければなりません...誰かが複雑な言葉で(つまり、深く)Pythonがオブジェクト参照でどのように動作するかを説明できますか?私は、それは最適化の問題だと思います(メモリを節約するか、リークを防ぐために...)
どうもありがとうございます。
編集: わかりました、それでは、より具体的にしましょう。私はPythonが時々ゴミを収集しなければならないことをよく知っています...しかし、私の場合:
Cythonで定義されたクラスによって返されるリストがありました:ノードのリストを管理するクラス'ネットワーク'(ネットワークとノードクラスの両方がで定義されていますCython extension
)。各ノードにはオブジェクトがあります[次に(void *)にキャストされます]'userdata'オブジェクト。ノードリストはcython内から入力され、UserDataはPythonスクリプト内から入力されます。したがって、Pythonでは、次のようになりました。
...
def some_python_class_method(self):
nodes = self.netBinding.GetNetwork().get_nodes()
...
for item in it:
a_site = PyLabSiteEvent()
#l_site.append(a_site) # WARN : Required to get an instance on 'a_site'
# that persits - workaround...
item.SetUserData(a_site)
後で同じcythongetterを使用して同じPythonクラスでこのノードリストを再利用します。
def some_other_python_class_method(self, node):
s_data = node.GetUserData()
...
したがって、ノードリストのUserDatasで作成されたストレージでは、私のPythonスクリプトは完全にブラインドであり、メモリを解放/再利用していたようです。これは、追加のリスト(ここでは'l_site')を使用して、2回目(ただし、Python側では明らかに1回目)を参照することで機能しました。これが私がPython自体についてもう少し知る必要があった理由ですが、私がPython間の通信を実装した方法はCython
、直面しなければならなかった問題に責任があるようです。