为什么我的列表值在我的代码的某些部分没有改变?

问题描述 投票:0回答:1

我正在做一些Hackerrank练习,并遇到了关于交换元素的问题。我的问题是关于列表的一般情况,为什么“arr”中的元素在第二个for循环中没有像第一个for循环那样改变?

def minimumSwaps(arr):
    arr = [i-1 for i in arr]
    ls = []

    minimumSwaps = 0
    for i, j in enumerate(arr):
        print(arr)
        if j == arr[j]:
            continue
        else:
            test = arr[i]
            arr[i] = arr[j]
            arr[j] = test
            minimumSwaps += 1
            ls.append(arr[i])
    print('\n\n')
    for i in range(len(ls)):
        print(arr)
        if i == arr[i]:
            continue
        else:
            test = arr[i]
            arr[i] = arr[arr[i]]
            arr[arr[i]] = test
            minimumSwaps +=1


    return minimumSwaps

minimumSwaps([4,3,1,2])

第一个循环的输出是:

[3, 2, 0, 1]

[1, 2, 0, 3]

[1, 0, 2, 3]

[1, 0, 2, 3]

这是我的预期,但第二个循环输出给了我这个:

[1, 0, 2, 3]

[1,0,2,3] <---如果它与第一个循环具有相同的行为,那么它将是[0,1,2,3]

python list pass-by-reference
1个回答
1
投票

i==0迭代中,test = arr[i]将1分配给test

arr[i] = arr[arr[i]]将0分配给arr[0]

arr[arr[i]] = test将1分回给arr[0],而不是arr[1],因为此时arr[0]为0,而不是1。

最终结果:一切都没有改变。

© www.soinside.com 2019 - 2024. All rights reserved.