首頁  >  文章  >  後端開發  >  為什麼「is」運算子對於 Python 中函數內部和外部的大整數表現不同?

為什麼「is」運算子對於 Python 中函數內部和外部的大整數表現不同?

DDD
DDD原創
2024-11-01 15:31:02827瀏覽

Why does the `is` operator behave differently with large integers inside and outside functions in Python?

函數中的大整數是否是運算子的意外行為


在使用Python 解譯器進行實驗時,發現了關於is的奇怪差異

當在函數內執行計算時,傳回True,但在外部執行時,結果為False。

<br>def func():<pre class="brush:php;toolbar:false">a = 1000
b = 1000
return a is b

a = 1000
b = 1000
a 是b, func()
>(False, True)

由於is 運算子評估物件的id,這表示在func 函數內,a 和b 引用相同的整數實例,而在func 函數之外函數,它們引用不同的物件。

說明


如參考手冊所述:


塊是作為一個單元執行的一段Python 程式文字。
以下是區塊:模組、函數體和類別定義。
每個互動輸入的指令都是一個區塊。


因此,在函數中,一個單一 程式碼區塊包含一個單一 數字文字對象,例如1000,導致id(a) == id(b) 為True。

在第二個實例中,存在單獨的代碼物件,每個物件的數字文字均為1000,導致id(a) != id (b)。

< ;p>重要的是,這種行為並不只限於整數文字。使用浮點文字觀察到可比較的結果(請參閱此處)。

請記得使用相等運算子 (==) 來比較對象,而不是恆等運算子 (is)。

這些知識與 CPython(Python 的主要實現)有關。替代實現可能會表現出不同的行為。

程式碼分析


為了便於理解,讓我們使用程式碼驗證此行為物件分析。

函數func:

函數物件有一個code 屬性,用於顯示編譯後的字節碼。 dis.code_info 簡潔地呈現了這些資料:

<br>print(dis.code_info(func))<br>名稱:func<br>檔名:<stdin><br>參數計數:0<br>僅限Kw 的參數:0 <br>本地數:2<br>堆疊大小:2<br>標誌:OPTIMIZED、NEWLOCALS、NOFREE<br>常數:<br> 0:無<br> 1:1000<br>變數名稱:<br>變數名稱:<br> 0: a<br> 1: b</stdin>

Constants 條目顯示常數為None(總是存在)和1000。因此,有

one

int 實例代表 1000。 a 和 b 引用這一物件。

互動式指令:

每個指令都是獨立解析、編譯和評估的程式碼區塊:



<br>com1 =compile("a=1000", filename="", mode="single ")com2 = compile("b=1000", filename="", mode= "single")<p></p>

每個賦值的程式碼物件看起來很相似,但

關鍵

,com1 和com2 有單獨的int 實例(1000 ),導致id(com1.co_consts[0]) == id(com2.co_consts[0]). p>

不同的程式碼對象,不同的內容。

注意事項

  • 鍊式語句:評估a = 1000; b = 1000 產生
    True 恆等式,因為這些鍊式賦值會編譯成一個程式碼區塊,產生1000 的一個實例。


  • 模組層級: 由於單一程式碼對象,在模組層級執行(如參考手冊所示)也會產生 True。

  • 可變物件: 除非明確初始化為相同物件(例如,a = b = []),否則可變物件的身份檢查將失敗。
  • 以上是為什麼「is」運算子對於 Python 中函數內部和外部的大整數表現不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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