我撰寫了如下 2 個代碼塊,并使用相同的 anaconda 虛擬環境以不同的方式運行它們:
第一個是:
a = 1431324 # just a long integer
b = 1431324 # same as a
print(a is b) # the result is 'False' running in Jupyter; the result is 'True' running in Pycharm
在 Pycharm 中,它就像a = 1431324and b = a,但實際上應該不同。
第二個是:
a,b = 1431324,1431324
print(a is b) # the result is 'True' running in both Jupyter and Pycharm
我知道對于短整數,python 會提前構建永遠不會被垃圾收集的物件,但對于長整數,python 不會提前創建物件。
但似乎有時 python 永遠不會為同一個長整數創建兩個物件。所以,我很困惑:
- 以上兩種賦值方式在物件級別有什么區別?
- 為什么運行相同代碼時 Pycharm 和 Jupyter 的結果不同?
uj5u.com熱心網友回復:
如果你有這個功能:
def f():
a = 1431324
b = 1431324
return a is b
它可能會回傳True。
當您寫入a,b = 1431324,1431324您的 REPL 時,它基本上會“使用兩個元素構建元組,1431324and 1431324,然后將其解包并將其存盤在兩個變數中,aand b”。這兩個常量1431324可以合并為相同的(窺視孔優化器將用預先構建的常量替換構建元組(1431324, 1431324)。
您可以通過查看位元組碼找到此常量:
>>> import dis
>>> code = compile('a,b = 1431324,1431324', '<str>', 'exec')
>>> dis.dis(code)
1 0 LOAD_CONST 0 ((1431324, 1431324))
2 UNPACK_SEQUENCE 2
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
>>> code.co_consts
((1431324, 1431324), None)
>>> code.co_consts[0][0] is code.co_consts[0][1]
True
當您有兩條不同的行時,它們會分別編譯,因此不會合并常量:
>>> a = compile('a = 1431324', '<str>', 'exec')
>>> a.co_consts
(1431324, None)
>>> b = compile('b = 1431324', '<str>', 'exec')
>>> b.co_consts
(1431324, None)
>>> a.co_consts[0] is b.co_consts[0]
False
這也發生在 PyCharm REPL 中。也許您一次輸入多行,或者正在運行一個完整的腳本(在預先執行之前將其編譯為位元組碼,因此常量被合并)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/470245.html
標籤:Python
上一篇:如何進行數學運算熊貓資料框
