2016-03-18 10 views

Antwort

6

Beide Male der Speicher für 'something' wird wennx zurückgewonnen werden war der letzte Verweis auf das String-Objekt. Im ersten Beispiel verwenden Sie ein wenig mehr Speicher, weil Sie den Namen x herum behalten.

Ich habe etwas gesucht und es sieht so aus, als ob der Speicher sofort zurückgewonnen wird: further reading.

Es gibt einen konzeptionellen Unterschied jedoch, und Ihr Programm wird sich anders verhalten. Wenn Sie del x, Sie unbind der Name x, und diesen Namen zu verwenden versuchen, eine NameError erhöhen werden:

>>> x = 'something' 
>>> del x 
>>> x 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 

Wenn Sie x = None gesetzt Sie rebindx ein Name None, für das Objekt zu sein und können Verwenden Sie die Variable weiterhin wie erwartet.Zum Beispiel für truthy/falsy Tests:

>>> x = None 
>>> if not x: 
...  print('hello cshin9!') 
... 
hello cshin9! 
1

Die beiden Anweisungen unterscheiden sich dadurch, dass sie mit dem aktuellen Namespace arbeiten: Erstere ändert einfach den Wert der Variablen, während del die Variable vollständig entfernt. Der vorhergehende Wert, auf den x zeigt, wird auf jeden Fall Müll gesammelt.

Leistungsunterschiede sind vernachlässigbar.

0

Nein, es ist nicht das gleiche, sehen wir folgendes Beispiel:

x = "something" 
x = None 
type(x) 
<type 'NoneType'> 

z = "asd" 
del z 
type(z) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'z' is not defined 

auf Keine macht den Variablenwert Keiner zu sein und haben NoneType. Das Löschen der Variablen macht die Variable jedoch durch Löschen aus dem Kontext unzugänglich.

2

Wenn Sie eine Variable auf None setzen oder beides löschen, wird der Verweis auf das Objekt x freigegeben. Der Hauptunterschied ist, dass mit x = None der Name x noch existiert, obwohl es jetzt auf ein anderes Objekt (None) zeigt. Bei Verwendung von del wird der Name ebenfalls gelöscht.

Für den Müllsammler gibt es keinen Unterschied. del erzwingt keine Speicherbereinigung des referenzierten Objekts.

Bearbeiten: wie @viroide wies darauf hin, mit del verursacht eine Ausnahme ausgelöst werden beim Versuch, die Variable x aufrufen.

+0

Was würde die Müllsammlung des Objekts erzwingen? – cshin9

+1

Laut https://docs.python.org/2/library/gc.html wird 'gc.collect()' den Garbage Collector zwingen, nicht referenzierten Speicher freizugeben. Ich kenne keine Methode, um eine einzelne Variable explizit freizugeben, und ich bezweifle, dass eine solche Methode existiert. –

2

Ich war neugierig, so habe ich beschlossen, auf einen Blick zu haben, was das Modul dis sagt von diesem Code ausgeführt wird:

import dis 

def f(): 
    v = 'x' 
    v = None 
    del v 
    return None 

print(dis.dis(f)) 

Das Ergebnis ist

4   0 LOAD_CONST    1 ('x') 
       3 STORE_FAST    0 (v) 

    5   6 LOAD_CONST    0 (None) 
       9 STORE_FAST    0 (v) 

    6   12 DELETE_FAST    0 (v) 

    7   15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE 

und die Dokumentation sagt, dass DELETE_FAST

Löscht lokale co_varnames[var_num].

während LOAD_CONST

Schiebt co_consts[consti] auf den Stapel.

Also, in Bezug auf Operationen/Speicher führt LOAD_CONST zwei Operationen (wo ein Speicher verwendet), und ich denke, dass es nur dann relevant wird, wenn Sie eine große Menge von Elementen (nicht eine gerade) - deshalb Vielleicht möchten Sie del verwenden.

Dies erklärt auch, warum Sie nicht mehr auf die Variable v zugreifen können (da sie aus dem Namensraum gelöscht wurde, während LOAD_CONST nur eine weitere Zuweisung ist).

Verwandte Themen