看板 Python 關於我們 聯絡資訊
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://www.ptt.cc/bbs/Python/M.1515218082.A.790.html ※ 編輯: suhang (172.89.32.145), 01/06/2018 13:55:11
handsomeLin: 把他拆成三步看就很明顯了吧 01/06 14:37
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
tedwu2001: 你把i都帶進去就知道為什麼了啊 01/06 19:15
tedwu2001: 喔,看錯了。抱歉 01/06 19:21
tedwu2001: unpacking先對運算式求值:A[i], A[A[i]-1] = 3, 2 01/06 19:35
tedwu2001: 從左而右賦值:a[i] = 3 ( a=> [1,3,3]) 01/06 19:38
tedwu2001: a[a[i] - 1] = 2 => a[3 - 1] = 2 ( a => [1, 3, 2]) 01/06 19:38
tedwu2001: 主要就是A[i]變了,然後求值先發生 01/06 19:39
gmccntzx1: 我把說明弄成影片,參考 https://youtu.be/r-MffpJ5-KE 01/06 19:56
gmccntzx1: 可用dis.dis()看bytecode, 而python執行的順序是由左而 01/06 19:58
gmccntzx1: 右,有求值的動作會先做. 01/06 19:59
gmccntzx1: 所以你可以試試看,改成 01/06 20:00
gmccntzx1: A[A[i] - 1], A[i] = A[i], A[A[i] - 1] 01/06 20:00
gmccntzx1: 反而可以得到你要的結果. 01/06 20:00
ilikekotomi: 感謝樓上兩位 今天下午也想不通 01/06 21:47
handsomeLin: 因為你temp一開始就擺錯東西了啊..第一步修改a[i]呢 01/08 01:20