[英]Python: Behaviour of float memory addressing
全部,當我從 Spyder IDE 中執行以下代碼時,我得到相同的 a、b 和數字 1000 的 ID。但是當我從 Spyder 控制台執行代碼時,我得到不同的 ID(a 的 ID 是不同於 b)。 眾所周知,浮點數是不可變的,但在 spyder 編輯器執行時它們的行為就像是可變的。 知道為什么會這樣。
a=1000.
b=1000.
print('id of a='+str(id(a)))
print('id of b='+str(id(b)))
print('id of 1.'+str(id(1000.)))
謝謝
這與 Spyder 無關,這純粹是 Python 優化,正如@Barmar 所解釋的那樣。
當為 line-execute 分配值時(即使在執行時對行進行了分組),將提供以下輸出:
>>> a = 1000.
>>> b = 1000.
>>> print(f'{id(a)=}\n{id(b)=}')
id(a)=140093502852336
id(b)=140093502851184
不同的身份證。
然而,當賦值被包裝在一個函數中時(如下所示),Python 執行的優化基本上會說:“嘿,我已經為那個值有了一個變量,所以我會再次使用它。”
def test():
a = 1000.
b = 1000.
print(f'{id(a)=}\n{id(b)=}')
>>> test()
id(a)=140093502851472
id(b)=140093502851472
相同的 ID。
如test()
函數的字節碼所示,由於編譯器優化,相同的 ID已分配給變量。
2 0 LOAD_CONST 1 (1000.0) # <-- Here (1)
2 STORE_FAST 0 (a)
3 4 LOAD_CONST 1 (1000.0) # <-- Here (1)
6 STORE_FAST 1 (b)
4 8 LOAD_GLOBAL 0 (print)
10 LOAD_CONST 2 ('id(a)=')
12 LOAD_GLOBAL 1 (id)
14 LOAD_FAST 0 (a)
16 CALL_FUNCTION 1
18 FORMAT_VALUE 2 (repr)
20 LOAD_CONST 3 ('\nid(b)=')
22 LOAD_GLOBAL 1 (id)
24 LOAD_FAST 1 (b)
26 CALL_FUNCTION 1
28 FORMAT_VALUE 2 (repr)
30 BUILD_STRING 4
32 CALL_FUNCTION 1
34 POP_TOP
36 LOAD_CONST 0 (None)
38 RETURN_VALUE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.