一日一技:在 Python 中,is 並不一定包含==
- 2019 年 10 月 8 日
- 筆記
攝影:產品經理
買單:kingname
在我們日常使用 Python 時,大家可能有這樣一種認識:
- a == b 為
True
,a is b 不一定為True
- a is b 為
True
,則 a == b 一定為True
>>> a = 'abc!' >>> b = 'abc!' >>> a == b True >>> a is b False >>> c = a >>> a is c True >>> a == c True
這是因為 ==
只比較值,而 is
同時比較值和內存地址。簡單來說:你左手邊有一個人,右手邊有一個人,兩個人長得一模一樣,那麼左手邊的人==右手邊的人
;你左手邊有一個人,一分鐘以後這個人走到了你的右手邊,那麼剛才左手邊的人 is 現在右手邊的人
但凡事總有意外,情況下面的代碼:
為什麼會出現這種情況?a is b
為 True,a == b
卻為 False
。
你可以先停在這裡,猜一下a 和 b 裏面的值到底是什麼東西。
現在來揭開答案,我們來網上看兩行:
a 和 b 的值為nan
,它的意思是Not a Number
,非數。
nan
與任何數,包括它自己比較,結果都是 False,這是IEEE-754[1]規定的:
Python 在實現這個數據的時候,根據 IEEE-754的要求,也做了限制:
相關的文檔地址詳見 Python 的 math 庫[2]
所以,這裡 a == b 為 False,是一種特殊情況。並不是 Python 出現了錯誤。
參考資料
[1]
IEEE-754: https://zh.wikipedia.org/wiki/IEEE_754#%E7%89%B9%E6%AE%8A%E5%80%BC
[2]
math 庫: https://docs.python.org/3/library/math.html