Почему значения моего списка не меняются в какой-то части моего кода? - PullRequest
0 голосов
/ 07 апреля 2019

Я выполнял несколько упражнений Хакерранка и столкнулся с проблемой обмена элементами Мой вопрос касается списков в целом, почему элементы в "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] </p>

1 Ответ

1 голос
/ 07 апреля 2019

На итерации 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.

Конечный результат: ничего не изменилось.

...