Quando ho digitato:Risultato inaspettato da sys.getrefcount
>>> astrd = 123
>>> import sys
>>> sys.getrefcount(astrd)
3
>>>
Non ricevo dove è astrd
usato 3 volte?
Quando ho digitato:Risultato inaspettato da sys.getrefcount
>>> astrd = 123
>>> import sys
>>> sys.getrefcount(astrd)
3
>>>
Non ricevo dove è astrd
usato 3 volte?
... 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?
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ì?
grazie per una soluzione appropriata – user46646
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.
grazie per una soluzione appropriata – user46646
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.
grazie per una soluzione appropriata – user46646
grazie per una soluzione appropriata – user46646
così quando faccio un "del astrd" il suo conteggio di riferimento diventa 0 e viene raccolto da gc? – user46646