雖然 Python 為 -5 到 256 之間的值維護一個整數緩存,但該緩存不會直接影響編譯後的程式碼。
在編譯後的程式碼中,編譯器會一起分析文字,將相等的常數值合併為一個物件來最佳化記憶體使用。此行為不僅適用於整數,也適用於浮點數。
考慮以下範例:
# Interactive >>> a = 257 >>> b = 257 >>> a is b False
在互動式解釋器中,每一行都被單獨解析和編譯。因此,a 和 b 引用不同的 PyInt_Objects,儘管它們具有相同的值。
# Compiled $ echo 'a = 257 > b = 257 > print a is b' > test.py $ python test.py True
從檔案編譯程式碼時,編譯器會分析整個程式碼並可以合併相同的文字。這表示本例中的 a 和 b 將指向同一個 PyInt_Object,結果 is 比較結果為 True。
編譯器的最佳化過程是由 compiler_add_o 函數執行的,它使用字典來儲存常數。相同的常數將佔用字典中的相同位置,從而導致編譯後的字節碼中出現單一常數物件。
編譯器的合併行為不適用於元組等複雜文字或清單。雖然所包含的元素可能會被合併,但文字本身將仍然是不同的物件。
>>> a = (257, 258) >>> b = (257, 258) >>> a is b False >>> a[0] is b[0] True
Python 編譯器執行重大最佳化以減少記憶體使用,包括在編譯程式碼中合併相同的常數。雖然整數快取本身不會直接影響這些最佳化,但涉及相同值的整數比較仍將如預期運行,相同的值會導致 is 和 == 比較為 True。
以上是Python 的整數快取會影響編譯程式碼的整數比較嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!