16

Ho cercato nella documentazione ufficiale di python, ma non riesco a trovare che cos'è un ciclo di riferimento. Qualcuno potrebbe per favore chiarire che cosa è per me, come sto cercando di capire il modulo GC. Grazie in anticipo per le risposte.Cos'è un ciclo di riferimento in python?

risposta

15

Un ciclo di riferimento indica semplicemente uno o più oggetti che si riferiscono l'un l'altro, in modo tale che se lo si estraesse su carta con le frecce che rappresentano le dipendenze si vedrebbe un ciclo.

La (quasi) ciclo semplice riferimento è avere due oggetti a e b che fanno riferimento l'uno all'altro:

a.other = b 
b.some_attr = a 

naif munnizzari lavorano rigorosamente fuori dal fatto che un oggetto fa riferimento a un altro oggetto. In questo caso, se entrambi i numeri a e non sono indicati da nessun altro, si riferiscono ancora l'un l'altro e un garbage collector ingenuo potrebbe non recuperare la memoria. (Non so se Python può essere intercettato da cicli di riferimento oppure no, però.)

EDIT: Il ciclo di riferimento più semplice è un oggetto che si riferisce a se stesso:

a = [] 
a.append(a) 
10

Questo è un ciclo di riferimento:

l = [] 
l.append(l) 

Il primo elemento di l, cioè l[0], è oggi un riferimento ciclico l stessa.

3
>>> x=[1,2,3] 
>>> x.append(x) 
>>> x 
[1, 2, 3, [...]] 
>>> 

Ora qui la variabile x si riferisce a se stessa, questo è chiamato ciclo di riferimento.

7
>>> aRef = [] 
>>> aRef.append(aRef) 
>>> print aRef 
[[...]] 

Questo crea un oggetto nell'elenco di cui da una variabile denominata aRef. lo first element nell'elenco oggetti è un riferimento a se stesso. In questo caso, lo del aRef dereferenziamento aRef all'oggetto lista. Tuttavia, il conteggio dei riferimenti dell'oggetto elenco non diminuisce a zero e l'oggetto elenco non è garbage collector, poiché l'oggetto list fa ancora riferimento a se stesso. In questo caso, il garbage collector in Python controllerà periodicamente se esistono tali riferimenti circolari e l'interprete li raccoglierà. Di seguito è riportato un esempio per raccogliere manualmente lo spazio utilizzato dagli oggetti di riferimento circolari.

>>> import gc 
>>> gc.collect() 
0 
>>> del aRef 
>>> gc.collect() 
1 
>>> gc.collect() 
0