Python:无法交换列表中的两个元素

sum*_*mer 0 python

有没有人可以帮我看看这段代码.我试图在leetcode中解决第一个缺失的正面问题.但是这个代码导致无限循环,因为我发现我无法交换A [i]和A [A [i] -1].但我测试使用这个简单的代码交换到列表中的元素:

A = [2,1]
A[0], A[1] = A[1], A[0]
print A # A = [1,2]
Run Code Online (Sandbox Code Playgroud)

我不知道错误是什么:(

def firstMissingPositive(self, A):
    i = 0
    length = len(A)
    while i < length:
        if A[i] >= 1 and A[i] <= length:
            if A[i] != i+1 and A[A[i]-1] != A[i]:
                A[i], A[A[i]-1] = A[A[i]-1], A[i]
            else:
                i += 1
        else:
            i += 1
    for i in range(length):
        if A[i] != i+1:
            return i+1
    return length + 1
Run Code Online (Sandbox Code Playgroud)

jwo*_*der 5

您正在A[i]执行赋值语句期间进行修改,因此A[A[i]-1]左侧的=评估不会评估您期望它的方式.你需要改变这个:

A[i], A[A[i]-1] = A[A[i]-1], A[i]
Run Code Online (Sandbox Code Playgroud)

对此:

tmp = A[i]-1
A[i], A[tmp] = A[tmp], A[i]
Run Code Online (Sandbox Code Playgroud)

Python语言参考中的注释解决了这种现象:

警告:虽然赋值的定义暗示的左侧和右侧之间的重叠是"安全"(例如a, b = b, a交换两个变量),重叠分配到的变量是不是安全的集合!例如,以下程序打印[0, 2]:

x = [0, 1]
i = 0
i, x[i] = 1, 2
print x
Run Code Online (Sandbox Code Playgroud)