2012-04-24 9 views
12

私は理解しているように、sys.getrefcount()は、以下の場合には1も「必要がある」と、オブジェクトの参照数を返します。なぜsys.getrefcount()は2を返しますか?

import sys,numpy 
a = numpy.array([1.2,3.4]) 
print sys.getrefcount(a) 

しかし、それは2であることが判明しました!だから、私場合:

del a 

"numpy.array([1.2,3.4])は、" オブジェクトがまだ(無ガベージコレクション)がありますか?

+1

もっと簡単なデモンストレーションを作成できます。x = 1.1; print sys.getrefcount(x) –

答えて

20

getrefcount()を呼び出すと、参照は値によって関数の引数にコピーされ、一時的にオブジェクトの参照カウントをバンプします。これは第2の参考文献の由来です。

これはdocumentationで説明されています。

返されるカウントは、一般的にあなたが想像するより1つ大きくなり、 それは getrefcount().

の引数として(一時的な)参照が含まれているため、あなたの2番目の質問に関して:

私が "del a"の場合、 "numpy.array([1。 2,3,4]) "オブジェクトはまだそこにある(ガベージコレクションなし)?時間getrefcount()終了することにより

は、配列の参照カウントは1に戻りするだろう、とその後の del aは、メモリを解放します。

+0

「値によってコピーされた」場合、2番目の参照はありません。 Pythonは引数を引数として渡し、明示的に尋ねられない限り値をコピーしません。 – bukzor

+0

@bukzor:答えを慎重に読んだ場合は、 "値で"という言葉が "reference"という単語に当てはまることがわかります。あなたが私が言っていることを誤解していることは明らかです。残念ながら、私は明快さと精度を向上させるために答えをどのように言い直すか分かりません。具体的な提案があれば教えてください。 – NPE

+2

getrefcount()を呼び出すと、その関数のローカル変数は指定された引数を参照し、一時的にオブジェクトの参照カウントをバンプします。 – bukzor

関連する問題