2016-05-12 27 views
0

Während über Python Infinity lesen, ich quer durch das kam:Warum gibt float ('Inf') float ('Inf') false in Python zurück?

>>>float('Inf') == float('Inf') 
True 
>>>float('Inf') is float('Inf') 
False 
>>>float('Inf') is not float('Inf') 
True 

ich, dass gleich Werke verstehen, aber ich frage mich, was float('Inf') tatsächlich zeigt auf, dass machen die is Test Rückkehr False? Ist es jedes Mal anders, wenn Sie float('Inf') anrufen?

EDIT: Ich frage nicht über den Unterschied zwischen == und is. Ich frage nach den Implementierungsdetails von float('Inf') und der Art dieses Objekts. setzen,

+5

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) – GingerPlusPlus

+0

Das ist, weil "ist" Speicheradresse von zwei Objekten vergleicht, während '==' die Objekte selbst vergleicht. || Wie oben, während Sie mit 'is' vergleichen, erstellen Sie tatsächlich zwei verschiedene Objekte mit derselben Struktur im Speicher. Zwei Objekte haben die gleiche Struktur, aber sie sind nicht gleich, da die Adressen unterschiedlich sind. Denke es wie das Universum. –

+0

Ja, das verstehe ich, aber auf welche Adresse weist es hin? –

Antwort

2

is und == in Python sind ziemlich unterschiedlich. is prüft Identität während == prüft auf Gleichheit, wie einige andere Benutzer bereits here:Is there a difference between == and is in Python?

float() angegeben haben erstellt (oder vielleicht schaffen, auf dem Dolmetscher je) ein neues Objekt, das nicht identisch ist (aber gleich) auf ein anderes Objekt erstellt von float() mit dem gleichen Argument.

CPython kann eine True für Ihren Scheck zurück, aber andere VMs oder Dolmetscher nicht als durch Microsoft

So beschrieben:

>>> float(2) is float(2) 
>>> False 
>>> float(2) == float(2) 
>>> True 

In der Tat, ihre Identität als gesehen werden ganz anders mit id()

>>> id(float(2)) 
>>> 251452 
>>> id(float(2)) # same call 
>>> 251934  # different result 

Also sollten Sie nur is verwenden, wenn Sie wirklich, wirklich auf Identität und Wert nicht testen möchten.

+1

'float()' * könnte * ein neues Objekt erstellen; ein unternehmungslustiger Dolmetscher könnte sich bestimmte Werte merken oder vorbelegen, die voraussichtlich gemeinsam verwendet werden. – chepner

+0

@chepner Was man in Python leicht sehen kann, indem man etwas wie 1000 ist 1000 macht und sieht, dass es wahr ist. Allerdings ist 'x = 1000' und' x ist 1000' nicht richtig, genau aus dem Grund, den Sie gerade angegeben haben. – zephyr

+0

@chepner Ich habe das gerade in einem Schnitt angegeben. Vielen Dank –

0

einfach is Arbeiten auf objects und wird nur TRUE zurück, wenn und wenn die zwei Variablen gleiche Objekt zeigt, während == Arbeiten auf value so ,, der Grund, es False sagt, ist, weil ein neuer Schwimmer aufgerufen wird

0

Wenn Sie sagen float('Inf'), erstellen Sie ein neues Objekt im laufenden Betrieb, das irgendwo im Speicher gespeichert wird und einen Verweis auf diesen Speicherort hat. Wenn Sie das tun

>>>float('Inf') == float('Inf') 

Sie erstellen zwei solche Objekte, die jeweils mit dem gleichen Wert, aber in zwei verschiedenen Speicherplätzen. Der Vergleich hier vergleicht die beiden Werte in diesen zwei Speicherorten und natürlich wird es wahr werden.

Wenn Sie das tun

>>>float('Inf') is float('Inf') 

wieder sind Sie zwei neue Objekte jeweils den gleichen Wert zu schaffen, aber an verschiedenen Orten. Aber jetzt versuchst du, die Referenzen mit den Speicherorten zu vergleichen, und natürlich werden diese nicht gleich sein.

sein Dies kann klarer, wenn Sie das Konzept der

>>>a = float('Inf') 
>>>b = float('Inf') 
>>>a == b 
True 
>>>a is b 
False 

Hoffentlich betrachten, wenn man bedenkt, dass a und b die tatsächlichen Objekte sind als Sie erstellen (und nicht sie ohne Namen zu schaffen, wie in Ihrem Beispiele) ist es klarer, was passiert.

+0

Sagen Sie "Objekt" statt "Variable". Es gibt etwas Wahres an der Aussage "Python hat keine Variablen"; Es hat Namen, die sich auf Objekte beziehen. – chepner

+0

Das klingt für mich wie Semantik. Wenn Sie Variable als primitiven Datentyp meinen, dann hat Python keine Variablen. Aber ich benutze Variable in einem allgemeinen Sinn, um einen Namen zu meinen, der sich auf etwas bezieht. In Python ist etwas immer ein Objekt, aber der Name ist immer noch eine Variable. – zephyr

+1

"variable" schlägt jedoch Mutabilität vor, in Python können Sie ändern, auf welches Objekt sich ein Name bezieht, und Sie können einige Objekte mutieren, die Vermeidung der Wortvariablen vermeidet manchmal Verwirrung. – RemcoGerlich

0

Und Sie brauchen nicht float aufrufen() oder ‚Inf‘ zu sehen:

a = 1. 
b = 1. 
a == b 
True 
a is b 
False 

als Antwort Hinzufügen nur, weil ich nicht richtig als Kommentar Formatierung erhalten können arbeiten, um zu @Nishant Antwort.