2012-04-24 17 views
12

Wie ich verstehe, sys.getrefcount() gibt die Anzahl der Referenzen eines Objekts, das 1 in dem folgenden Fall sein „sollte“:Warum gibt sys.getrefcount() 2 zurück?

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

Es stellte sich jedoch 2 heraus! Also, wenn ich:

del a 

Wird die "numpy.array ([1.2,3.4])" Objekt noch da sein (keine Müllabfuhr)?

+1

Sie könnten eine einfachere Demonstration konstruieren: x = 1.1; print sys.getrefcount (x) –

Antwort

20

Wenn Sie getrefcount() aufrufen, wird die Referenz nach Wert in das Argument der Funktion kopiert, wodurch die Referenzzahl des Objekts vorübergehend erhöht wird. Hier kommt die zweite Referenz her.

Dies wird in der documentation erklärt:

zurück

Die Zahl ist in der Regel eine höhere als man erwarten könnte, , weil sie die (temporäre) Referenz als Argument an getrefcount().

enthält Was Ihre zweite Frage betrifft:

Wenn ich "del a", wird die "numpy.array ([1. 2,3,4]) "Objekt noch da sein (keine Müllsammlung)?

Durch die Zeit getrefcount() Ausfahrten, den Referenzzähler des Arrays wird auf 1, und eine nachfolgende del a freisetzen würde die Erinnerung zurück.

+0

Wenn es "nach Wert kopiert" würde, gäbe es keine zweite Referenz. Python übergibt Argumente als Verweis und kopiert Werte niemals, wenn nicht explizit gefragt. – bukzor

+0

@bukzor: Wenn Sie die Antwort sorgfältig lesen, werden Sie sehen, dass die Wörter "nach Wert" auf das Wort "Verweis" zutreffen, das Sie in Ihrem Zitat bequem weggelassen haben. Es scheint klar zu sein, dass du missverstanden hast, was ich sagen wollte. Leider sehe ich nicht, wie ich die Antwort neu formuliere, um die Klarheit und Präzision zu verbessern; Wenn Sie spezielle Vorschläge haben, lassen Sie es mich wissen. – NPE

+2

Wenn Sie getrefcount() aufrufen, verweisen die lokalen Variablen dieser Funktion auf das angegebene Argument, wodurch die Verweisanzahl des Objekts vorübergehend erhöht wird. – bukzor

Verwandte Themen