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.
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
@roippi Ich denke, es ist eigentlich ein Zufall von Rapid malloc/free/malloc. 'a = []; b = []; id (a) == id (b) # Dies ist falsch' –
@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