Почему значения моего списка не меняются в какой-то части моего кода?

#python #list #pass-by-reference

#python #Список #передача по ссылке

Вопрос:

Я выполнял несколько упражнений по 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('nn')
    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]

Комментарии:

1. Почему вы печатаете до того, как что-либо сделаете со списком, а не после?

2. @user2357112 Это было просто для целей тестирования, это никак не влияет. После первой итерации второго цикла for список все равно должен был измениться, но этого не произошло.

Ответ №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.

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