#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.
Конечный результат: ничего не изменилось.