Frage

Ich versuche, zwei Strings zu vergleichen mit ist . Eine Saite wird von einer Funktion zurückgegeben, und der andere ist nur im Vergleich erklärt. ist Tests für Objektidentität, sondern nach dieser Seite , es funktioniert auch mit zwei identischen Zeichenketten wegen der Speicher-Optimierung von Python. Aber, folgendes nicht:

def uSplit(ustring):
        #return user minus host
        return ustring.split('!',1)[0]

user = uSplit('theuser!host')
print type(user)
print user
if user is 'theuser':
    print 'ok'
else:
    print 'failed'

user = 'theuser'

if user is 'theuser':
    print 'ok'

Der Ausgang:

type 'str'
theuser
failed
ok

ich den Grund dafür bin zu raten, ist eine Stringliteral durch eine Funktion eine andere „Art“ der Zeichenfolge als ein String zurückgegeben. Gibt es trotzdem eine Funktion zu bekommen Stringliteral zurückzukehren? Ich weiß, ich könnte == , aber ich bin nur neugierig.

War es hilfreich?

Lösung

Die Website, die Sie zitieren, sagt dieser:

  

Wenn zwei Zeichenketten gleich sind, haben sie denselben Speicherplatz gesetzt worden.

Aber

uSplit('theuser!host')

ist kein Stringliteral - es ist das Ergebnis einer Operation auf dem wörtlichen 'theuser!host' ist

.

Auf jeden Fall sollten Sie in der Regel nicht für String Gleichheit überprüfen is zu verwenden, da diese Speicheroptimierung in jedem Fall nur eine Implementierung Detail ist, sollten Sie nicht verlassen kann.


Außerdem sollten Sie is für Dinge wie is None verwenden. Verwenden Sie es zur Überprüfung, ob zwei Objekte - von Klassen, die Sie entworfen - dieselbe Instanz sind. Sie können es nicht leicht für Strings oder Zahlen verwenden, da die Regeln für die Erstellung dieser integrierten Klassen komplex sind. Einige Strings werden interniert. Einige Zahlen, ähnlich sind interniert.

Andere Tipps

Diese Seite, die Sie zitiert sagt (Hervorhebung von mir): „Wenn zwei Zeichenfolge Literalen gleich sind, haben sie auf denselben Speicherplatz gesetzt worden“. Python Praktikanten Literalzeichenfolgen, aber Strings, die einzelnen Objekte aus einer beliebigen Funktion sind zurückgegeben werden. Der is Operator kann als ein Zeiger Vergleich gedacht werden, so dass zwei verschiedene Objekte werden nicht als identisch vergleichen (auch wenn sie die gleichen Zeichen enthalten, dh. Sie sind gleich).

Was haben Sie laufen in ist die Tatsache, dass Python nicht immer intern alle seine Saiten. Weitere Einzelheiten hier:

http://mail.python.org/pipermail/tutor /2009-July/070157.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top