2009-04-17 9 views

risposta

6

Dal getrefcount docstring:

... Numero restituito è generalmente più alto di quanto si potrebbe aspettare, perché include il riferimento (temporaneo) come argomento di getrefcount().

Gli altri due riferimenti indicano che Python internamente contiene due riferimenti all'oggetto. Forse i dizionari locals() e globals() contano come un riferimento ciascuno?

+0

grazie per una soluzione appropriata – user46646

+0

così quando faccio un "del astrd" il suo conteggio di riferimento diventa 0 e viene raccolto da gc? – user46646

6

penso che conta i riferimenti a 123, provare altri esempi, come

>>> import sys 
>>> astrd = 1 
>>> sys.getrefcount(astrd) 
177 
>>> astrd = 9802374987193847 
>>> sys.getrefcount(astrd) 
2 
>>> 

Il refcount per 9802374987193847 adatta la risposta di Codeape.

Ciò è probabilmente dovuto al fatto che i numeri sono immutabili. Se ad esempio si utilizza un elenco, sarà sempre 2 (da un prompt pulito).

Btw, ottengo 2 per 123, forse la configurazione è leggermente diversa? O potrebbe essere legato al tempo o così?

+0

grazie per una soluzione appropriata – user46646

5

int sono implementate in modo particolare, essi vengono memorizzati nella cache e condivisi, che il motivo per cui non si ottiene 1.

e Python, utilizza oggetti di riferimento contati. astrd è esso stesso un riferimento, quindi in realtà si ottiene il numero di riferimenti a "123" int ". Prova con un altro tipo (definito dall'utente) e otterrai 1.

+0

grazie per una soluzione appropriata – user46646

7

Non è astrd a cui viene fatto riferimento tre volte, ma il valore 123. astrd è semplicemente un nome per il numero (immutabile) 123, a cui è possibile fare riferimento molte volte. In aggiunta a ciò, interi piccoli sono normalmente ripartite:

>>> astrd = 123 
>>> sys.getrefcount(astrd) 
4 
>>> j = 123 
>>> sys.getrefcount(astrd) 
5 

Nella seconda assegnazione, non viene creato nessun nuovo intero, invece j è solo un nuovo nome per l'intero 123.

Tuttavia, dato molto grandi numeri interi, questo non vale:

>>> i = 823423442583 
>>> sys.getrefcount(i) 
2 
>>> j = 823423442583 
>>> sys.getrefcount(i) 
2 

interi condivise sono un dettaglio di implementazione di CPython (tra gli altri). Poiché i piccoli interi vengono istanziati molto spesso, la loro condivisione consente di risparmiare molta memoria. Ciò è reso possibile dal fatto che gli interi sono immutabili in primo luogo.

Per il riferimento aggiuntivo nel secondo esempio, cfr. codeape's answer.

+0

grazie per una soluzione appropriata – user46646

Problemi correlati