作者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/cn.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