簡體   English   中英

Python:浮點內存尋址的行為

[英]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 所解釋的那樣。

示例 1:基於行的執行

當為 line-execute 分配值時(即使在執行時對行進行了分組),將提供以下輸出:

>>> a = 1000.
>>> b = 1000.
>>> print(f'{id(a)=}\n{id(b)=}')

id(a)=140093502852336
id(b)=140093502851184

不同的身份證。

示例 2:基於函數的執行

然而,當賦值被包裝在一個函數中時(如下所示),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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM