2016-07-05 6 views
4

Im folgenden Python-Skript, warum die zweite Assert durchläuft (d. H., Wenn 0 bis 257 hinzufügen und speichert das Ergebnis in y, dann x und y werden verschiedene Objekte)? Vielen Dank!Integer-Python-Caching

x = 257 
y = 257 
assert x is y 

x = 257    
y = 257 + 0 
assert x is not y 
+0

nicht '' 'auf Gleichheit zu prüfen ... im Grunde immer ... es ist buchstäblich die Speicherposition Variable ... Python Prestres eine kleine Anzahl von Konstanten, die ju sein werden st zufällig in einigen Fällen zu arbeiten ... –

+0

Überprüfen Sie diese Antwort aus; es erklärt, warum "ist" scheint manchmal seltsam zu arbeiten! http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python –

Antwort

1

ganze Zahlen sind nicht wandelbar so dass jeder Betrieb in einem neuen Speicherplatz führt zu ändern

>>> a =9876 
>>> id(a) 
38478552 
>>> a+=1 
>>> id(a) 
38478576 
>>> a+=0 
>>> id(a) 
38478528 

is ist die tatsächliche Speicherplatz des Objekts überprüft ... und sollten grundsätzlich nie verwendet werden Überprüfen Sie auf Gleichheit Wert (obwohl es willkürlich auf einige kleine Teilmenge von Fällen arbeiten kann)

1

Wenn Sie is verwenden, Sie überprüfen, ob die beiden Objekte auf die gleiche Speicherstelle verweisen. Wenn sie es tun, ist das Ergebnis Wahr. Andernfalls ist das Ergebnis False.

Um zu überprüfen, ob die Werte äquivalent sind, verwenden Sie ==, z. assert x == y. Alternativ, um zu bestätigen, dass sie nicht gleich sind, verwenden Sie !=, z. assert x != y.

x = 257 
y = 257 


>>> id(x) 
4576991320 

>>> id(y) 
4542900688 

>>> x is y 
False 

x = 257 
y = 257 + 0 

>>> id(x) 
4576991368 

>>> id(y) 
4576991536