2014-06-08 10 views
6

Während eine Frage über die Verwendung des is Schlüsselwort zu beantworten versuchen, dachte ich, dass dieser Code aus:Warum verhält sich "a is b" im interaktiven Modus anders und wenn es vom Skript ausgeführt wird?

Script:

a = 123456 
b = 123456 
print a is b # True 

interaktiven Modus:

>>> a = 123456 
>>> b = 123456 
>>> a is b 
False 

gab im interaktiven Python-Modus verschiedene Ausgaben und wenn es von einem Skript ausgeführt wurde.

Von this answer:

Die aktuelle Implementierung eine Reihe von Integer-Objekten für alle ganzen Zahlen zwischen -5 und 256 hält, wenn Sie einen int in diesem Bereich erstellen, erhalten Sie tatsächlich wieder einen Verweis auf das bestehende Objekt .

Also, ich würde erwarten, dass a is bTrue für ganze Zahlen im Bereich [-5, 256] nur zurückgegeben. Dies gilt jedoch nur für den interaktiven Modus, nicht wenn es von einem Skript ausgeführt wird.

Frage: Warum verhält sich a is b im interaktiven Modus anders und wenn es vom Skript ausgeführt wird?


Hinweis: Getestet in Python 2.7 und Python 3

+2

Ergebnisse sind die gleichen auf Python 3. 'False' für interaktive,' True' für Skript. – vaultah

+0

Python 3.3 verhält sich wie 2.7. Interessanterweise ist >>> a = b; >>> a ist b' gibt 'True' zurück. – Davidmh

Antwort

1

Der Unterschied ist, wie Konstanten behandelt werden. Im interaktiven Modus gibt es keine Möglichkeit zu sagen, ob bereits eine Zahlenkonstante vorhanden ist oder nicht. Bei kompiliertem Code wird jedoch jede Konstante intern in einer Tabelle gespeichert, und Duplikate werden entfernt. Dies ist jedoch ein Implementierungsdetail und muss nicht für jede Python-Version gelten.