整數和字串標識

Python 對一系列整數使用內部快取,以減少重複建立的不必要開銷。

實際上,在比較整數標識時,這可能會導致混淆行為:

>>> -8 is (-7 - 1)
False
>>> -3 is (-2 - 1)
True

並使用另一個例子:

>>> (255 + 1) is (255 + 1)
True
>>> (256 + 1) is (256 + 1)
False

等什麼?

我們可以看到身份操作 is 為某些整數(-3256)產生 True 但對其他整數(-8257)則沒有。

更具體地說,[-5, 256] 範圍內的整數在直譯器啟動期間內部快取,並且只建立一次。因此,它們是**相同的,**並且將它們的身份與 is 的輸出進行比較 True; 超出此範圍的整數(通常)是即時建立的,它們的身份與 False 相比較。

這是一個常見的陷阱,因為這是一個常見的測試範圍,但通常情況下,程式碼在後期分段過程中失敗(或更糟糕的是 - 生產),在完美開發後沒有明顯的原因。

解決方案是始終使用等於==)運算子而不是標識(is)運算子來比較值

Python 還會保留對常用字串的引用,並且在比較字串的標識(即使用 is)時可能會導致類似的混淆行為。

>>> 'python' is 'py' + 'thon'
True

字串'python'是常用的,因此 Python 有一個物件,所有對字串'python'的引用都使用。

對於不常見的字串,即使字串相等,比較標識也會失敗。

>>> 'this is not a common string' is 'this is not' + ' a common string'
False
>>> 'this is not a common string' == 'this is not' + ' a common string'
True

因此,就像整數規則一樣,總是使用相等==)運算子而不是標識(is)運算子來比較字串值