列表值交换:正确的顺序是什么?为什么?

kai*_*sif 2 python

对于整数列表,例如A = [2, 10, -5],我得到错误

Traceback (most recent call last):
  File "so.py", line 6, in <module>
    v, A[v-1] = A[v-1], v
IndexError: list assignment index out of range
Run Code Online (Sandbox Code Playgroud)

码:

for i, v in enumerate(A):
    while 1<=v<=len(A) and v != A[v-1]:
        v, A[v-1] = A[v-1], v
Run Code Online (Sandbox Code Playgroud)

但这有效:

for i, v in enumerate(A):
    while 1<=v<=len(A) and v != A[v-1]:
        A[v-1], v = v, A[v-1]
Run Code Online (Sandbox Code Playgroud)

为什么交换元素的顺序在这里很重要?v总是被检查受到约束.

奇怪的是,不能再现一个较小的例子.但是, A = [6, 5, 4, 3, 2] 变成一个无限循环.

Tim*_*Tim 7

Python按照提供的顺序交换变量,因此v赋值为at A[v-1],然后尝试重新分配A[v-1]- 但由于v已被修改为列表元素,v-1因此超出范围A.