2012-04-24 15 views
12

Jak rozumiem, sys.getrefcount() zwraca liczbę odniesień do obiektu, które „powinny” wynosić 1 w następującym przypadku:Dlaczego sys.getrefcount() zwraca 2?

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

Jednak okazało się, że 2! Tak więc, jeśli I:

del a 

Czy "numpy.array ([1.2,3.4])" obiekt nadal istnieje (nie garbage collection)?

+1

Można skonstruować prostszą demonstrację: x = 1.1; print sys.getrefcount (x) –

Odpowiedz

20

Po wywołaniu getrefcount() odwołanie jest kopiowane przez wartość do argumentu funkcji, tymczasowo podnosząc liczbę referencyjną obiektu. To stąd pochodzi drugie odniesienie.

Jest to wyjaśnione w documentation:

Ilość zwrócony jest na ogół jeden wyższy niż można się było spodziewać, ponieważ zawiera (tymczasowe) odwołanie jako argument getrefcount().

Jeśli chodzi o twoje drugie pytanie:

Jeśli "del a", będzie "numpy.array ([1. 2,3,4]) "obiekt nadal tam jest (bez zbierania śmieci)?

przez czas getrefcount() wyjść, liczba odniesienia tablicowej, która będzie do tyłu do 1, a późniejsza del a by zwolnić pamięć.

+0

Gdyby było "skopiowane według wartości", nie byłoby drugiego odniesienia. Python przekazuje argumenty przez odniesienie i nigdy nie kopiuje wartości, chyba że jest to jawnie zadawane. – bukzor

+0

@bukzor: Jeśli przeczytasz dokładnie odpowiedź, zobaczysz, że słowa "według wartości" odnoszą się do słowa "odniesienie", które wygodnie pominąłeś w cytacie. Wydaje się oczywiste, że źle zrozumiałeś to, co próbowałem powiedzieć. Niestety, nie widzę, jak przeformułowuję odpowiedź, aby poprawić jasność i precyzję; jeśli masz jakieś konkretne sugestie, daj mi znać. – NPE

+2

Po wywołaniu getrefcount(), zmienne lokalne tej funkcji odwołują się do podanego argumentu, tymczasowo podnosząc liczbę odwołań do obiektu. – bukzor