2013-05-17 9 views
6

Unregelmäßiges Verhalten von "ist" -Ausdrücken in Python.Wie bewertet Python "ist" Ausdrücke?

>>> 258 -1 is 257 
False 

Und

>>> 258 -1 == 257 
True 
  1. Wie wertet Python "ist" Ausdruck? und warum zeigt es es als falsch, obwohl es wahr ist?

  2. Warum passiert es nur zu bestimmten Zahlen?

    2 - 1 1 Wahre

funktioniert perfekt in Ordnung.

+0

'>>> 2-1 ist 1' gibt 'True' zurück lol – TehTris

+0

@carlosdc es ist nicht genau ein Duplikat. Da funktioniert es für andere Nummern. Darum habe ich gefragt. – Rahul

+1

@Rahul Machen Sie das klar in Ihrer Frage. – askewchan

Antwort

2

is vergleicht Objektidentität und liefert True nur, wenn beide Seiten das gleiche Objekt sind. Aus Leistungsgründen pflegt Python einen "Cache" von kleinen ganzen Zahlen und verwendet sie wieder, so dass alle int(1) Objekte das gleiche Objekt sind. In CPython liegen die zwischengespeicherten Ganzzahlen zwischen -5 und 255, aber dies ist ein Implementierungsdetail, auf das Sie sich nicht verlassen sollten. Wenn Sie die Gleichheit vergleichen möchten, verwenden Sie ==, nicht is.

+0

Sie können diese Art von Sache auch mit Strings passieren, da String-Literale bis zu einer bestimmten Größe zwischengespeichert werden. Und Dinge wie 'foo =" foo "; foo ist foo.strip() 'kann auch' True' zurückgeben. – mgilson

1

Die Python is operator prüft auf Objektidentität, nicht Objektwert. Die beiden Ganzzahlen müssen sich intern auf dasselbe tatsächliche Objekt beziehen, um wahr zurückzugeben.

Dies wird für "kleine" Ganzzahlen aufgrund eines von Python verwalteten internen Caches wahr sein, aber zwei Zahlen mit dem gleichen Wert werden im Vergleich zu is im Allgemeinen nicht den Wert true zurückgeben.

6

is zur Identitätsprüfung verwendet, um zu überprüfen, ob beide Variablen auf das gleiche Objekt zeigen, während == zur Überprüfung Wert verwendet wird.

Vom docs:

Der Betreiber is und is not Test für Objektidentität: x is y ist true , wenn und nur wenn x und y das gleiche Objekt. x is not y ergibt den inversen Wahrheitswert .

>>> id(1000-1) == id(999) 
False 

""" What is id? 
id(object) -> integer 
Return the identity of an object. This is guaranteed to be unique among 
simultaneously existing objects. (Hint: it's the object's memory address.) 
""" 

>>> 1000-1 is 999 
False 
>>> 1000-1 == 999 
True 
>>> x = [1] 
>>> y = x #now y and x both point to the same object 
>>> y is x 
True 
>>> id(y) == id(x) 
True 
>>> x = [1] 
>>> y = [1] 
>>> x == y 
True 
>>> x is y 
False 
>>> id(x),id(y)  #different IDs 
(161420364, 161420012) 

Aber einige kleine ganze Zahlen (-5 bis 256) und kleine Strings werden von Python im Cache: Why (0-6) is -6 = False?

#small strings 
>>> x = "foo" 
>>> y = "foo" 
>>> x is y 
True 
>>> x == y 
True 
#huge string 
>>> x = "foo"*1000 
>>> y = "foo"*1000 
>>> x is y 
False 
>>> x==y 
True 
2

Die is Operator prüft Objektidentität: das erstellte Objekt durch den Aufruf 258-1 ist NICHT das gleiche Objekt wie das von 257 erstellte Objekt. Der Operator == prüft, ob die Werte der verglichenen Objekte gleich sind.

Versuchen Sie mit help('is').

+0

Warum ist dann 2-1 1 Returns True? – Rahul

+0

@Rahul Python speichert einige kleine ganze Zahlen und kleine Strings, siehe: http://StackOverflow.com/Questions/11476190/Why-0-6-is-6-false –

+0

Beantwortet hier: http://StackOverflow.com/a/16615952/2237320 – Alice

Verwandte Themen