簡體   English   中英

Python:'inf 是 inf',但 '-inf 不是 -inf'?

[英]Python: 'inf is inf', but '-inf is not -inf'?

Python 3.7

在編寫最大值的搜索代碼時,我遇到了負無窮大的奇怪行為。 有人可以解釋為什么這種行為嗎?

>>> inf = float('inf')
>>> inf is inf
True
>>> (-inf) is (-inf)
False

而且我已經意識到使用==進行比較會更好,但我對上述問題的答案很感興趣。

inf是一個變量,綁定到特定的 object。 任何 object is它自己,所以inf is inf

-inf是一個表達式。 它進行數學運算,並產生一個 object 值浮點負無窮大。 Python 不承諾這是否與具有該值的任何其他 object 相同。 在您的情況下, -inf的兩個評估碰巧產生了不同的對象。

同樣,沒有關於 -inf 是什么的承諾-inf is -inf會產生什么。 當前的 CPython 實現恰好始終產生 False。 PyPy 的原始處理產生 True 不同的 Python 版本或實現可能會根據當前的 memory 壓力,或者您是否將其作為腳本或交互方式或任何其他因素運行,不一致地產生 True 或 False。 CPython 本身已經存在 object 身份在腳本或交互方式中不同的情況; 例如,這個:

x = 1000
y = 1000
print(x is y)

根據您是否以交互方式運行它,在當前 CPython 實現中打印不同的內容。

-inf是一個產生新float object 的操作,您在同一個表達式中使用了兩次。 產生兩個不同的對象,因為 Python 實現不需要注意兩個子表達式可以返回對相同 object 的引用。

我想補充一點:在 Python 中,當我們使用id() function, is operator, == operator 等時,我們使用的真正目標是value ,而不是variable

a is b等於id(a) == id(b)

在您的代碼中, inf = float('inf')將產生一個名為inf的值。

inf也是一個表達式,它將被評估為一個值。

inf is inf將是True ,因為實際上兩個表達式的評估值是相同的。

在 Python 中,專注於價值觀更好更容易。

例如,在 CPython 實現中:

a = 1
b = 1
a is b # will be true

a = 10000
b = 10000
a is b # will be false

a = '10000'
b = '10000'
a is b # will be true

如果我們專注於變量,這樣的事情就很奇怪。 如果我們專注於值,如果我告訴你 CPython 實現有緩存池,它用於小 int 和一些文字 str 值,那么事情就很簡單了:

因為緩存池的原因,small int 1被緩存了,str '10000'也被緩存了,而 big int 10000沒有被緩存,所以會被創建兩次。

嘗試專注於價值觀。

暫無
暫無

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

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