在使用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。因此,有
互動式指令:
每個指令都是獨立解析、編譯和評估的程式碼區塊:
<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。
以上是為什麼「is」運算子對於 Python 中函數內部和外部的大整數表現不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!