2014-02-22 24 views
14

Im Folgenden macht Sinn für mich:Wann erstellt Python neue Listenobjekte für leere Listen?

>>> [] is [] 
False 

Da Listen sind wandelbar, ich würde erwarten, [] jedes Mal ein neues leere Liste Objekt, um es in einem Ausdruck erscheint. Unter Verwendung dieser Erklärung überrascht jedoch das folgende:

id([]) == id([]) 
True 

Warum? Was ist die Erklärung?

+0

Ich würde einige nicht null Geldsumme wetten, dass 'id ([]) == id ([])' ist nicht 'True' auf allen Aromen von Python. (yep, checked.) cPython neigt dazu, Speicher auf diese Weise neu zuzuordnen, es ist ein Implementierungsdetail. – roippi

+0

@roippi Ich denke, es ist eigentlich ein Zufall von Rapid malloc/free/malloc. 'a = []; b = []; id (a) == id (b) # Dies ist falsch' –

+0

@roippi - Ich würde wetten, dass es einige Varianten von Python gibt, wo es manchmal funktioniert und andere nicht, abhängig davon, wann genau der GC läuft. – Malvolio

Antwort

12

Im ersten Beispiel ist [] nicht [] genau , weil die Listen veränderbar sind. Wären sie nicht, könnten sie ohne Probleme auf die gleiche Karte mappen. Im zweiten Beispiel erstellt id([]) eine Liste, ruft die ID ab und gibt die Liste frei. Das zweite Mal um es erstellt eine Liste wieder, aber "legt es an den gleichen Ort", weil nichts anderes passiert ist. id ist nur während eines Objekts Lebensdauer gültig ist, und in diesem Fall seine Lebensdauer ist praktisch null

Vom docs on id:

Dies ist eine ganze Zahl (oder long integer), die für einzigartige und konstant ist garantiert dieses Objekt während seiner Lebenszeit. Zwei Objekte mit nicht überlappenden Lebensdauern können denselben id() -Wert haben.


kommentiert Demontage:

0 LOAD_GLOBAL    0 (id) # load the id function 
    3 BUILD_LIST    0   # create the first list 
    6 CALL_FUNCTION   1   # get the id 
    9 LOAD_GLOBAL    0 (id) # load the id function 
    12 BUILD_LIST    0   # create the second list 
    15 CALL_FUNCTION   1   # get the id 
    18 COMPARE_OP    2 (==) # compare the two ids 
    21 RETURN_VALUE      # return the comparison 

Hinweis gibt es keine STORE_FAST die Liste zu behalten. Daher wurde es sofort nach der Übergabe an die id Funktion verworfen.

+0

Ich erinnere mich, dass Sie die gleiche Frage nicht lange zuvor beantwortet haben: P – zhangxaochen

+0

nicht diese, vielleicht ist es nicht Sie, aber muss ein Duplikat sein – zhangxaochen

+1

Gut beantwortet. Zum Beispiel in 'def f (x, y): Rückgabe id (x) == id (y)' wo sowohl 'x' als auch 'y' am Leben bleiben müssen, wird 'f ([], []) 'ausgewertet "Falsch". – Loax