[問題] arry swap

看板Python作者 (suhang)時間8年前 (2018/01/06 13:54), 8年前編輯推噓3(3013)
留言16則, 4人參與, 8年前最新討論串1/1
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

01/06 14:37, 8年前 , 1F
把他拆成三步看就很明顯了吧
01/06 14:37, 1F

01/06 14:41, 8年前 , 2F
Python的swap我認為只是幫大家省略步驟而已
01/06 14:41, 2F
試了一下 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

01/06 19:15, 8年前 , 3F
你把i都帶進去就知道為什麼了啊
01/06 19:15, 3F

01/06 19:21, 8年前 , 4F
喔,看錯了。抱歉
01/06 19:21, 4F

01/06 19:35, 8年前 , 5F
unpacking先對運算式求值:A[i], A[A[i]-1] = 3, 2
01/06 19:35, 5F

01/06 19:38, 8年前 , 6F
從左而右賦值:a[i] = 3 ( a=> [1,3,3])
01/06 19:38, 6F

01/06 19:38, 8年前 , 7F
a[a[i] - 1] = 2 => a[3 - 1] = 2 ( a => [1, 3, 2])
01/06 19:38, 7F

01/06 19:39, 8年前 , 8F
主要就是A[i]變了,然後求值先發生
01/06 19:39, 8F

01/06 19:56, 8年前 , 9F
我把說明弄成影片,參考 https://youtu.be/r-MffpJ5-KE
01/06 19:56, 9F

01/06 19:58, 8年前 , 10F
可用dis.dis()看bytecode, 而python執行的順序是由左而
01/06 19:58, 10F

01/06 19:59, 8年前 , 11F
右,有求值的動作會先做.
01/06 19:59, 11F

01/06 20:00, 8年前 , 12F
所以你可以試試看,改成
01/06 20:00, 12F

01/06 20:00, 8年前 , 13F
A[A[i] - 1], A[i] = A[i], A[A[i] - 1]
01/06 20:00, 13F

01/06 20:00, 8年前 , 14F
反而可以得到你要的結果.
01/06 20:00, 14F

01/06 21:47, 8年前 , 15F
感謝樓上兩位 今天下午也想不通
01/06 21:47, 15F

01/08 01:20, 8年前 , 16F
因為你temp一開始就擺錯東西了啊..第一步修改a[i]呢
01/08 01:20, 16F
文章代碼(AID): #1QK6IYUG (Python)