Sou*_*Ray 8 python arrays list python-3.x
我有一个清单:
lis = [12,45,15,67,89]
Run Code Online (Sandbox Code Playgroud)
我想交换12和89这样的列表应该看起来
lis = [89,45,15,67,12]
Run Code Online (Sandbox Code Playgroud)
当我这样做的时候
lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]
Run Code Online (Sandbox Code Playgroud)
什么都没有改变
lis = [12,45,15,67,89]
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
lis5[0], lis5[4] = lis5[4], lis5[0]
Run Code Online (Sandbox Code Playgroud)
它完美无缺
lis = [89,45,15,67,12]
Run Code Online (Sandbox Code Playgroud)
那么为什么它不是第一种方式呢?PS-我想要做第一种方式的全部原因是因为我想在列表中找到max元素然后将其与列表的第一个元素交换.
就像是:
max1 = max(lis)
lis[0], lis[lis.index(max1)] = lis[lis.index(max1)], lis[0]
Run Code Online (Sandbox Code Playgroud)
简而言之,lis.index(max1)在不同的时间评估左/右侧; 然后评估为不同的值(0左侧,4右侧).
a, b = b, a
Run Code Online (Sandbox Code Playgroud)
以上声明:
(b, a)元组a和b
lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]
Run Code Online (Sandbox Code Playgroud)
变
lis[0], lis[lis.index(89)] = lis[4], lis[0]
Run Code Online (Sandbox Code Playgroud)
=>
lis[0], lis[lis.index(89)] = 89, 0
Run Code Online (Sandbox Code Playgroud)
=>
lis[0] = 89
lis[lis.index(89)] = 0
Run Code Online (Sandbox Code Playgroud)
=>
lis[0] = 89
lis[0] = 0 # NOTE lis.index(89) == 0 at this point
Run Code Online (Sandbox Code Playgroud)
所以lis[0]分配89,然后分配原始值0.=>(仅更改了第一个元素,并重新分配了原始值)
要避免此问题,请在swap语句之前分配索引:
idx = lis.index(89)
lis[0], lis[idx] = lis[idx], lis[0]
Run Code Online (Sandbox Code Playgroud)