2016-05-13 7 views
2

はPythonがメモリを管理する方法の私の理解にリンクリストリンクリストをPythonで実装したら、どうすればそのメモリを解放できますか?ここで

class ListNode(object): 
def __init__(self,val): 
    self.val = val 
    self.next = None 

ベースのノードの私の実装である、私は私がメモリを解放する必要があるとき、私はまだ以下のように関数を使用する必要があると思います、 ではない?

def free_linked_list(head): 
    while head: 
     next_node = head.next 
     del head # As long as no variable is pointed to this node, it would be freed from the memory. Is it? 
     head = next_node 

したがって、私の問題は です。1.私の理解は正しいですか? 2.そうでない場合、このリンクされたリストのメモリを解放するにはどうすればよいですか?それとも、Pythonはすでに私のためにそれをしていますか?

+0

ヘッドノードを削除する(または参照を失う)場合、pythonはリンクリストの残りの部分を解放する必要があります。 – mgilson

答えて

0

Cや他の低レベル言語のように、手動でメモリ管理する代わりに、Pythonがガベージコレクションを使用することは間違いありません。つまり、Pythonランタイムは、プログラム内の他のオブジェクトによって参照されていない「孤立した」オブジェクトを定期的にマークして削除するバックグラウンドスレッドを利用します。

実際、あなたの例は、必要以上に複雑です。リストの先頭への参照がない限り、リスト全体は "孤立"し、Pythonランタイムによって収集されたガーベジになります。

+0

しかし、このリンクリストノードは、私の見解では比較的異なっています。私はヘッドノードへのリフェンスを削除しましたが、このヘッドノードはまだ次のノードへの冗長性を持っています。そして、ヘッドノードの値と、次のノードへのポインタについてはどうでしょうか?したがって、どのようにして、ヘッドノードを廃棄すべきであるかをPythonは知っていますか? –

+0

どういう意味ですか?どのような点で違いますか? –

+0

ああ!私は今理解する!リストへの参照が削除されると、リスト内のノードはすべて参照を失います。 –

0

はいご理解いただけます。オブジェクトがもはや参照されていない限り、Pythonのガベージコレクションはそれを処理します。 gc.collect()を明示的に呼び出して、本当に必要な場合にガベージコレクションを強制することもできます。 https://docs.python.org/2/library/gc.html

関連する問題