[英]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.