2016-05-12 174 views
0

雖然讀了Python的無窮大,我來到這個防空火炮:爲什麼float('Inf')是float('Inf')在Python中返回false?

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

據我所知,等於作品,但我想知道什麼float('Inf')實際上指向的是使is測試返回False?每次撥打float('Inf')都不一樣嗎?

編輯:我不是問關於==is之間的差異。我在詢問關於float('Inf')的實現細節以及此對象的性質。

+5

可能重複[在Python中\'== \'和\'is \'有區別嗎?](http://stackoverflow.com/questions/132988/is-there-a-difference-between python) – GingerPlusPlus

+0

這是因爲'is'比較了兩個對象的內存地址,而'=='比較了這些對象本身。 ||如上所述,通過'is'進行比較時,實際上會在內存中創建兩個具有相同結構的不同對象。兩個對象具有相同的結構,但它們並不相同,因爲地址不同。認爲它像宇宙。 –

+0

是的,我明白,但是它指向什麼地址? –

回答

2

is==在Python中有很大的不同。 is檢查身份而==檢查平等其他一些用戶已經指出here:Is there a difference between == and is in Python?

float()創建(或可能產生,這取決於你的解釋),一個新的對象,它是不相同的(但等於)通過創建另一個對象float()具有相同的論點。

CPython的可能是你的支票返回True,但可能無法通過Microsoft

這樣描述的其他虛擬機或 解釋:

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

其實他們的身份可以被看作是完全不同使用id()

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

所以,你應該只使用is,如果你真的,真的想測試身份和價值。

+1

'float()'*可能*創建一個新的對象;一個有進取心的口譯員可能會記住或預先分配預期會被普遍使用的某些值。 – chepner

+0

@chepner通過做類似'1000的事情可以很容易地在Python中看到1000是1000',並且看到它是真的。然而,說'x = 1000'並且'x是1000'是不正確的,因爲你剛剛表示。 – zephyr

+0

@chepner我剛剛在一個編輯中表示。謝謝 –

0

簡而言之,is作品上objects,並只返回TRUE,如果,如果兩個變量都指向同一個對象,而==作品上value因此,,它說False的原因是因爲一個新的浮動的叫了起來

0

當你說float('Inf')時,你正在創建一個新的對象,它被存儲在某個地方的內存中,並且引用了該內存位置。當你做

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

你正在創建兩個這樣的對象,每個對象具有相同的值,但在兩個不同的內存位置。這裏的比較將比較這兩個存儲位置中的兩個值,當然它會出現。

當你

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

再次要創建的每個相同的值,但在不同位置的兩個新的對象。但是現在你正試圖比較存儲器位置的參考,當然這些參數不會相同。

如果你考慮的

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

概念希望,一旦你認爲ab是你創建(而不是一個沒有名字創建爲實際的對象,這可能是更清楚你的例子),更清楚發生了什麼。

+0

說「對象」而不是「變量」。聲明「Python沒有變量」有一些事實。它具有指向對象的名稱。 – chepner

+0

這聽起來像我的語義。如果你的意思是變量是一個基本的數據類型,那麼是的,python沒有變量。但是我在一般意義上使用變量來表示一個引用某個事物的名稱。在python中,東西總是一個對象,但名稱仍然是一個變量。 – zephyr

+1

'變量'表示可變性,但在Python中,您可以更改名稱引用的對象,並且可以對某些對象進行變異,避免單詞變量有時會避免混淆。 – RemcoGerlich

0

而你並不需要調用浮動()或「天道酬勤」看到這樣的:

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

添加作爲回答,只是因爲我不能格式化爲一個註釋@Nishant正常工作響應。