簡體   English   中英

為什么float('Inf')是float('Inf')在Python中返回false?

[英]Why does float('Inf') is float('Inf') returns false in Python?

在閱讀有關Python的無窮大的同時,我遇到了這個問題:

>>>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')的實現細節以及此對象的性質。

在Python中, is==完全不同。 is用於身份檢查,而==平等檢查其他的一些用戶已經說過在這里:有沒有之間的差異==並且is在Python?

float()創建(或可能根據您的解釋器創建)一個新對象,該對象與float()創建的另一個具有相同參數的對象不同(但相等)。

Cpython可能會為您的檢查返回True ,但是其他VM或解釋器可能不符合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

簡而言之, isobjects起作用的,並且如果2個變量指向同一個對象,則僅返回== ,而==value起作用,所以說False的原因是因為調用了一個新的float

當您說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是您要創建的實際對象(而不是像示例中那樣未創建名稱),就可以更清楚地了解正在發生的情況。

而且您不需要調用float()或'Inf'來查看此信息:

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

添加為答案僅是因為我無法格式化作為對@Nishant響應的注釋而正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM