我嘗試在 Python 中分配三個表達式,但結果出乎意料。讓我們從簡單的交換開始。你可能知道這個任務的結果:A = [10, 11, 12]p = 0A[p + 1], A[p] = A[p], A[p + 1] # <--print(A)結果是(如預期的那樣):[11, 10, 12]現在我想更大膽一點,所以嘗試了這個任務:A = [10, 11, 12]p = 0p, A[p + 1], A[p] = p + 1, A[p], A[p + 1] # <--print(A)我以為結果會是:[10, 12, 11]然而,結果是:[10, 11, 10]這是出乎意料的!我閱讀了有關作業的 Python 文檔:盡管賦值的定義意味著左側和右側之間的重疊是“同時”的(例如 a, b = b,a 交換兩個變量),但分配給變量的集合內的重疊發生在左側- 向右,有時會導致混亂。例如,以下程序打印 [0, 2]:x = [0, 1]i = 0i, x[i] = 1, 2 # i is updated, then x[i] is updatedprint(x)我的交換沒有得到類似的結果。我不明白我的交換背后的邏輯。這是怎么回事?
1 回答

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
您可以將其視為使用臨時變量從左到右連續賦值的簡寫:
p, A[p + 1], A[p] = p + 1, A[p], A[p + 1]
相當于
temp1 = p + 1 # 1
temp2 = A[p] # 10 (A[0])
temp3 = A[p+1] # 11 (A[1])
p = temp1 # p = 1
A[p+1] = temp2 # A[2] = 10
A[p] = temp3 # A[1] = 11
所以 A = [10,11,10]
如果你放在p列表的末尾,你可能會更接近你的預期結果:
A[p + 1], A[p], p = A[p], A[p + 1], p + 1
A is now [11,10,12]
P is now 1
換句話說,后增量是可能的,但在這種情況下(其中在源數據中使用了預增量索引),預增量不起作用
您可以通過手動計算源數據中的偏移量來實現,但這有點違反直覺:
p, A[p+1], A[p] = p+1, A[p+1], A[p+2]
添加回答
舉報
0/150
提交
取消