作者suhang (suhang)
看板Python
標題[問題] arry swap
時間Sat Jan 6 13:54:39 2018
1)
A = [1, 3, 2]
i = 2
idx = A[i] - 1
A[i], A[idx] = A[idx], A[i]
>>> A = [1, 2, 3]
2)
A = [1, 3, 2]
i = 2
A[i], A[A[i] - 1] = A[A[i] - 1], A[i]
>>> A = [1, 3, 2]
為什麼 1)可以成功地交換 2)不行?
請大家指點迷津 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 172.89.32.145
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1515218082.A.790.html
※ 編輯: suhang (172.89.32.145), 01/06/2018 13:55:11
1F:→ handsomeLin: 把他拆成三步看就很明顯了吧 01/06 14:37
2F:→ handsomeLin: Python的swap我認為只是幫大家省略步驟而已 01/06 14:41
試了一下
temp = A[ A[i] - 1]
A[ A[i] - 1] = A[i]
A[i] = temp
這樣子可以成功地交換
那為什麼寫成一行 A[i], A[A[i] - 1] = A[A[i] - 1], A[i] 卻沒辦法?
※ 編輯: suhang (172.89.32.145), 01/06/2018 16:40:16
3F:→ tedwu2001: 你把i都帶進去就知道為什麼了啊 01/06 19:15
4F:→ tedwu2001: 喔,看錯了。抱歉 01/06 19:21
5F:→ tedwu2001: unpacking先對運算式求值:A[i], A[A[i]-1] = 3, 2 01/06 19:35
6F:→ tedwu2001: 從左而右賦值:a[i] = 3 ( a=> [1,3,3]) 01/06 19:38
7F:→ tedwu2001: a[a[i] - 1] = 2 => a[3 - 1] = 2 ( a => [1, 3, 2]) 01/06 19:38
8F:→ tedwu2001: 主要就是A[i]變了,然後求值先發生 01/06 19:39
10F:→ gmccntzx1: 可用dis.dis()看bytecode, 而python執行的順序是由左而 01/06 19:58
11F:→ gmccntzx1: 右,有求值的動作會先做. 01/06 19:59
12F:→ gmccntzx1: 所以你可以試試看,改成 01/06 20:00
13F:→ gmccntzx1: A[A[i] - 1], A[i] = A[i], A[A[i] - 1] 01/06 20:00
14F:→ gmccntzx1: 反而可以得到你要的結果. 01/06 20:00
15F:推 ilikekotomi: 感謝樓上兩位 今天下午也想不通 01/06 21:47
16F:推 handsomeLin: 因為你temp一開始就擺錯東西了啊..第一步修改a[i]呢 01/08 01:20