vergleiche ein Objekt mit einem leeren Tupel mit dem Operator 'is' in Python 2.x

8

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 ...

    
gurney alex 18.11.2011, 16:40
quelle

4 Antworten

11

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.

    
Steven Rumbalski 18.11.2011, 17:05
quelle
0

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 "" .

    
Cédric Julien 18.11.2011 16:46
quelle
0

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:

%Vor%

Natürlich könnte es wesentlich schlechter sein, wenn Sie gegen etwas mit einer benutzerdefinierten __eq__() -Methode vergleichen:

%Vor%

Wenn dieser Effizienzunterschied jedoch kritisch ist, denke ich, dass das auf ein Designproblem hindeuten würde.

    
Michael Hoffman 18.11.2011 17:09
quelle
0

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%     
Carlo Pires 18.11.2011 17:15
quelle

Tags und Links