一日一技:在 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