如果我們讓x = 2,我們執行x *= 5 3,結果是16,相當于如果我們已經完成x *= (5 3),而不是x = x * 5 3哪個會13。
我憑直覺理解這一點,但一位朋友想知道為什么x*= A B不等于x = x * A B,而這似乎是如何x = A B作業的;x = x A A.
我試圖對事情是如何在幕后作業的,以及為什么它是這樣作業的,提出一個令人滿意的解釋。
uj5u.com熱心網友回復:
“編譯器”知道在乘以左邊的值之前先計算 RHS,實際上,只是將 5 3 簡化為 8:
dis.dis("x *= 5 3")
1 0 LOAD_NAME 0 (x)
2 LOAD_CONST 0 (8) # <-- (5 3) = (8)
4 INPLACE_MULTIPLY
6 STORE_NAME 0 (x)
8 LOAD_CONST 1 (None)
10 RETURN_VALUE
在加法之前做乘法:
dis.dis("x = x*5 3")
1 0 LOAD_NAME 0 (x)
2 LOAD_CONST 0 (5)
4 BINARY_MULTIPLY
6 LOAD_CONST 1 (3)
8 BINARY_ADD
10 STORE_NAME 0 (x)
12 LOAD_CONST 2 (None)
14 RETURN_VALUE
和乘法前的加法
dis.dis("x = 3 x * 5")
1 0 LOAD_CONST 0 (3)
2 LOAD_NAME 0 (x)
4 LOAD_CONST 1 (5)
6 BINARY_MULTIPLY
8 BINARY_ADD
10 STORE_NAME 0 (x)
12 LOAD_CONST 2 (None)
14 RETURN_VALUE
仍然導致和之前的BINARY_MULTIPLY指令withx5BINARY_ADD3
uj5u.com熱心網友回復:
因為運算子優先級。所有<operator>=運算子的優先級與 相同=,低于常規算術運算子。所以
x *= 5 3
被決議為
x *= (5 3)
出于同樣的原因
x = 5 3
被決議為
x = (5 3)
而不是
(x = 5) 3
最后一個在 Python 中甚至沒有意義,因為=不能用于運算式,只能用于陳述句。但是您可以將其替換為:=運算子以獲得類似于 JavaScript 的內容。
uj5u.com熱心網友回復:
根據語言定義的要求,這與匯編語言無關,而與語言定義和對該規范的決議無關。
您的朋友將 * 和 = 分開,但它們是一個運算子,而不是兩個。因此,整個運算子只有一個優先級值。我們不能把這些分開,然后給每個人自己的優先級!
雖然這種運算子是某種快捷方式,但它是真正的運算子,不是宏,也不是文本替換的一種形式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/505360.html
標籤:javascript Python 编程语言
