[英]What's the difference between this 2 code
我有 2 個不同的代碼,我得到了不同的答案。 我想知道有什么區別
x, y = 0, 1
while y < 50:
print(y)
x, y = y, x + y
x=0
y=1
while y < 50:
print(y)
x=y
y=x+y
第一個代碼輸出是:1 1 2 3 5 8 13 21 34
和兩個代碼:1 2 4 8 16 32
x, y = y, x+y
的構建體的使用的原始值在RHS元組x
和y
執行任何任務之前x
和y
在左側。 它相當於
new_y = y
new_x = x + y
x = new_x
y = new_y
和
x = y
y = x + y
y
的新值是將x
的新值(即y
)添加到y
; 你已經失去了舊的價值。 你需要寫
old_x = x
x = y
y = old_x + y
元組解包是一種避免需要臨時變量old_x
。
區別在於評估的順序。
在第一個例子中,你有這個:
x, y = y, x + y
這是在右側計算兩個表達式,然后將它們存儲到一個元組中,然后在左側將它們解包。
因為這是一個“主”表達式(元組)的一部分,所以在元組的構造過程中不會更新任何變量。 這意味着:
y, x+y evaluates as (old value of y), (old value of x) + (old value of y)
一旦構造了元組,就設置了x
和y
。
您的第二個示例通過將賦值放入不同的語句中使事情明顯不同。 這會導致在計算第二個賦值之前更改 x 的值:
x=y
y = x + y
這相當於:
x = (old value of y)
y = (old value of y) + (new value of x == old value of y)
這將y
設置為2 * y
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.