Questo è un tentativo di comprendere meglio come funziona il conteggio dei riferimenti in Python.Informazioni sul conteggio dei riferimenti della variabile di classe
Creiamo un corso e lo istanziamo. conteggio di riferimento del grado sarebbe 1
(getrefcount
display 2
perché è proprie strutture interne riferimento che un'istanza di classe aumentare conteggio di riferimento da 1
):
>>> from sys import getrefcount as grc
>>> class A():
def __init__(self):
self.x = 100000
>>> a = A()
>>> grc(a)
2
s' a
variabili interne x
dispone 2
riferimenti:
>>> grc(a.x)
3
Mi aspettavo che fosse referenziato dal a
e dal metodo __init__
A
. Quindi ho deciso di controllare.
Così ho creato una variabile temporanea b
nello spazio dei nomi __main__
solo per poter accedere alla variabile x
. E 'aumentato il ref-numero per 1
per farlo diventare 3
(come previsto):
>>> b = a.x
>>> grc(a.x)
4
Poi ho cancellato l'istanza della classe e il conteggio ref diminuito del 1
:
>>> del a
>>> grc(b)
3
Così ora ci sono 2
riferimenti: uno è di b
e uno è di A
(come mi aspettavo).
Eliminando lo spazio dei nomi A
da __main__
, il conteggio diminuirà di 1
.
>>> del A
>>> grc(b)
3
Ma non succede. Non esiste una classe A
o le sue istanze che possono fare riferimento a 100000
, ma è comunque referenziata da qualcosa di diverso da b
nello spazio dei nomi __main__
.
Quindi, la mia domanda è, che cos'è 100000
a cui si fa riferimento a parte da b
?
BrenBarn ha suggerito che dovrei usare object()
invece di un numero che può essere memorizzato da qualche parte internamente.
>>> class A():
def __init__(self):
self.x = object()
>>> a = A()
>>> b = a.x
>>> grc(a.x)
3
>>> del a
>>> grc(b)
2
Dopo aver eliminato l'istanza a
c'erano solo riferimento da b
che è molto logico.
L'unica cosa che rimane da capire è il motivo per cui non è così con il numero 100000
.
Secondo me, 'A .__ dict__'? –
@JakobBowyer Ma quando elimino 'A', quindi' A .__ dict__' dovrebbe essere garbage collection perché non è referenziato da nulla (come ho capito). – ovgolovin
Vedere questa risposta: http://stackoverflow.com/questions/759740/unexpected-result-from-sys-getrefcount –