整數和字串標識
Python 對一系列整數使用內部快取,以減少重複建立的不必要開銷。
實際上,在比較整數標識時,這可能會導致混淆行為:
>>> -8 is (-7 - 1)
False
>>> -3 is (-2 - 1)
True
並使用另一個例子:
>>> (255 + 1) is (255 + 1)
True
>>> (256 + 1) is (256 + 1)
False
等什麼?
我們可以看到身份操作 is
為某些整數(-3
,256
)產生 True
但對其他整數(-8
,257
)則沒有。
更具體地說,[-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
)運算子來比較字串值。