Ich bin es gewohnt, if obj is None:
in Python zu sehen, und kürzlich bin ich auf if obj is ():
gestoßen. Da Tupel nicht veränderbar sind, klingt es wie eine vernünftige interne Optimierung im Python-Interpreter, dass das leere Tupel ein Singleton ist, was die Verwendung von is
ermöglicht, anstatt ==
zu benötigen. Aber ist das irgendwo garantiert? Seit welcher Version des Interpreters?
[edit] Die Frage ist wichtig, weil wenn if () kein Singleton ist und es eine Möglichkeit gibt, ein leeres Tupel mit einer anderen Adresse zu erzeugen, dann ist is {}
ein Fehler. Wenn es nur seit Python 2.x mit x & gt; 0, dann ist es wichtig, den Wert von x zu kennen, wenn Sie die Rückwärtskompatibilität Ihres Codes sicherstellen müssen. Es ist auch wichtig zu wissen, ob dies Ihren Code bei der Verwendung von pypy / jython / ironpython beschädigen kann ...
Aus den Python 2 Dokumenten und Python 3 docs :
... zwei Vorkommen des leeren Tupels können dasselbe Objekt ergeben oder nicht.
Mit anderen Worten, Sie können nicht darauf zählen, dass () is ()
als wahr ausgewertet wird.
Verwenden wir die Methode id () , um die interne ID von () zu erhalten:
%Vor%Es sieht so aus, als ob das () effektiv in Python als Singleton gespeichert wird (zumindest in Python & gt; 2.6).
Es gibt dasselbe Verhalten für die leere Zeichenfolge ""
.
Dies ist eine nicht garantierte Implementierungsdetail der aktuellen Versionen von CPython, so dass Sie nicht unbedingt in anderen Python-Implementierungen wie Jython, IronPython, PyPy und möglicherweise zukünftigen Versionen von CPython darauf zurückgreifen können.
Die Verwendung von is
scheint auf meinem System etwa 0,04 μs schneller zu sein, wenn man es mit einer großen Liste vergleicht:
Natürlich könnte es wesentlich schlechter sein, wenn Sie gegen etwas mit einer benutzerdefinierten __eq__()
-Methode vergleichen:
Wenn dieser Effizienzunterschied jedoch kritisch ist, denke ich, dass das auf ein Designproblem hindeuten würde.
Es geht nicht um Optimierung. Es geht um Objektvergleiche. Python "is" wird verwendet, um die Objektidentität zu testen, dann wird ein leeres Tupel verglichen "()" ist nicht erforderlich, um den Operator "==" zu verwenden. Tatsächlich kann alles in Python mit "ist" verglichen werden.
%Vor%Gleiches gilt für jeden anderen Wert:
%Vor%Tags und Links python