首頁  >  文章  >  後端開發  >  為什麼 Python 的「is」運算子對於不同程式碼區塊中的大整數表現不同?

為什麼 Python 的「is」運算子對於不同程式碼區塊中的大整數表現不同?

Susan Sarandon
Susan Sarandon原創
2024-11-01 15:26:31328瀏覽

Why Does Python's

Python 對大整數的「is」運算子行為

問題

在Python 中,is 運算子檢查物件身分而不是等價性。但是,在某些情況下,此行為可能是意外的,如下所示:

<code class="python">def func():
    a = 1000
    b = 1000
    return a is b

a = 1000
b = 1000

print(a is b, func())  # (False, True)</code>

is 比較在函數內傳回 True,但在函數外傳回 False。儘管評估結果不同,整數 a 和 b 似乎具有相同的值。

解釋

要理解這種行為,Python 解釋器對程式碼區塊的解釋至關重要。根據Python參考手冊,交互執行的每個命令都構成一個單獨的程式碼區塊。以下內容視為區塊:

  • 模組
  • 函數體
  • 類別定義

在單一程式碼區塊中,Python 快取某些對象,例如小整數(在[-5, 256] 範圍內)。當多個變數引用相同的整數文字時,它們都將引用相同的快取整數物件。但是,如果在不同的程式碼區塊中聲明文字,則會建立不同的整數物件。

不同的程式碼對象,不同的標識

為了說明這一點,請考慮每種情況的程式碼對象:

  • 函數func: a 和b 引用同一個整數物件(由Python 緩存,因為1000 在快取的整數範圍內)。
  • 互動式指令: a 和 b 引用不同的整數對象,因為它們是在單獨的程式碼區塊中定義的。

因此,a is b 在 func 區塊中計算為 True,其中所有整數都是緩存,並且在創建單獨物件的區塊外為 False。

注意事項

請注意以下注意事項:

  • 在單行中連結賦值語句可能會導致在 True 身分檢查中。
  • 由於模組的單一程式碼區塊,模組級執行將傳回 True。
  • 涉及可變物件的測試將始終傳回 False,因為它們沒有被快取。

結論

理解 Python 中程式碼區塊的概念對於解釋涉及身分比較的意外行為至關重要。雖然對於檢查不可變物件的身份很有用,但建議使用相等運算子(==)來比較值,因為它不依賴快取。

以上是為什麼 Python 的「is」運算子對於不同程式碼區塊中的大整數表現不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn