我對 Python 還很陌生,所以這對某些人來說似乎是一個微不足道的問題。但是我很好奇當你將一個新物件系結到一個變數時,Python 在內部是如何作業的,指的是系結到相同變數名的前一個物件。請參閱下面的代碼作為示例 - 我知道 python 打破了與原始物件 'hello' 的系結,將其系結到新物件,但是這里的事件順序是什么?python如何打破與原始物件的聯系但也參考它?
greeting = 'hello'
greeting = f'y{greeting[1:len(greeting)]}'
除了解釋之外,我也非常感謝一些背景關系。我知道字串是不可變的,但是浮點數和整數等其他型別呢?我是否了解python內部的運作方式是否重要?另外,如果可以的話,哪里是了解更多關于 Python 內部作業原理的好地方?
希望我的問題很清楚。
uj5u.com熱心網友回復:
通過拆機的解釋:
>>> dis.dis('''greeting = 'hello'
... greeting = f'y{greeting[1:len(greeting)]}'
... ''')
1 0 LOAD_CONST 0 ('hello')
2 STORE_NAME 0 (greeting)
2 4 LOAD_CONST 1 ('y')
6 LOAD_NAME 0 (greeting)
8 LOAD_CONST 2 (1)
10 LOAD_NAME 1 (len)
12 LOAD_NAME 0 (greeting)
14 CALL_FUNCTION 1
16 BUILD_SLICE 2
18 BINARY_SUBSCR
20 FORMAT_VALUE 0
22 BUILD_STRING 2
24 STORE_NAME 0 (greeting)
26 LOAD_CONST 3 (None)
28 RETURN_VALUE
最左邊的數字表示特定行的位元組碼從哪里開始。第 1 行非常不言自明,所以我將解釋第 2 行。
您可能會注意到,您的 f-string 無法在編譯后保留下來。它變成了一堆原始操作碼,將常量段的加載與格式化占位符的評估混合在一起,最終導致堆疊被構成最終字串的所有片段置頂。當它們都在堆疊上時,它會將所有片段放在最后一起BUILD_STRING 2(上面寫著“從堆疊中取出前兩個值并將它們組合成一個字串”)。
greeting只是一個持有系結的名字。它實際上并不包含值,只是對當前系結的任何物件的參考。并且原始參考LOAD_NAME完全在STORE_NAME彈出堆疊頂部并重新系結之前被推入堆疊(使用) greeting。
簡而言之,它起作用的原因是它的值在greeting被替換時不再需要;它用于制作新字串,然后被丟棄以支持新字串。
uj5u.com熱心網友回復:
在您的第二行中,Python 計算賦值陳述句的右側,該陳述句創建一個使用舊系結 for 的字串greeting。只有在評估該運算式之后,它才會處理賦值運算子,該運算子將該字串系結到名稱。這一切都是非常線性的。
浮點數和整數也是不可變的。只有串列和字典是可變的。實際上,尚不清楚在任何情況下如何修改整數物件。您不能參考物件的內部。重要的是要記住在這種情況下:
i = 3
j = 4
i = i j
最后一行只是創建一個新的整數/浮點物件并將其系結到i. 這些都沒有嘗試修改整數物件3。
我寫了這篇文章,試圖描述 Python 物件和我們使用的名稱之間的區別:
https://github.com/timrprobocom/documents/blob/main/UnderstandingPythonObjects.md
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/469295.html
下一篇:變數增加3而不是1
