![](/img/trans.png)
[英]Why does random.uniform(0, float(“inf”)) always return inf?
[英]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
。
簡而言之, is
對objects
起作用的,並且如果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
希望一旦您認為a
和b
是您要創建的實際對象(而不是像示例中那樣未創建名稱),就可以更清楚地了解正在發生的情況。
而且您不需要調用float()或'Inf'來查看此信息:
a = 1.
b = 1.
a == b
True
a is b
False
添加為答案僅是因為我無法格式化作為對@Nishant響應的注釋而正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.