Wenn er in einer Python interaktive Sitzung:Python nicht im interaktiven Modus Strings internieren?
In [1]: a = "my string"
In [2]: b = "my string"
In [3]: a == b
Out[3]: True
In [4]: a is b
Out[4]: False
In [5]: import sys
In [6]: print(sys.version)
3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
Auf der anderen Seite, wenn Sie das folgende Programm ausgeführt wird:
#!/usr/bin/env python
import sys
def test():
a = "my string"
b = "my string"
print(a == b)
print(a is b)
if __name__ == "__main__":
test()
print(sys.version)
Die Ausgabe lautet:
True
True
3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
Warum a is b
hat anderes Ergebnis in den obigen zwei Fällen?
Ich bin mir dessen bewusst this Antwort (und natürlich der Unterschied zwischen den ==
und is
Betreiber!, die den Punkt der Frage ist!), Sind aber nicht a
und b
das gleiche Objekt auch im ersten Fall? (Interpeter?), da sie auf die gleiche (unveränderliche) Saite zeigen?
Mögliche Duplikate von [Gibt es einen Unterschied zwischen \ '== \' und \ 'is \' in Python?] (Http://stackoverflow.com/questions/132988/is-there-a-difference-between) -und-ist-in-python) – Juggernaut
Sie müssten den cpython-Quellcode überprüfen, aber ich würde mir vorstellen, dass der Python-Interpreter intelligent genug ist, um zu erkennen, dass diese Strings identisch sind und Strings unveränderlich sind Zeige beide Variablen auf die gleiche Instanz. Daher gibt ein 'ist'-Test wahr zurück. Für die REPL, da die Strings inkrementell eingegeben werden, gibt es keine solche Optimierungsmöglichkeit und beide Variablen beziehen sich auf unterschiedliche Objekte. –
@AminEtesamian Von dem, was ich verstehe, ist die Frage eher, warum die IDs bei der Verwendung von Interpreter unterscheidet, aber die gleichen sind beim Ausführen einer .py-Datei. Ich denke, Pkaramol versteht den Unterschied zwischen ist und ==. – HolyDanna