#python #list
#python #Список
Вопрос:
Когда я пытаюсь поменять местами 2 элемента в списке, происходят некоторые странные вещи. При попытке выполнить этот код nums обновляется до [4, 1, 3, 1]
:
i = 1
nums = [-1, 4, 3, 1]
nums[i]
nums[nums[i]-1] = nums[nums[i]-1]
nums[i]
Однако, когда команда
nums[nums[i]-1]
nums[i] = nums[i]
nums[nums[i]-1]
nums — это то [-1, 1, 3, 4]
, чего я ожидаю.
Я совершенно не понимаю, что происходит в этих двух случаях. Кто-нибудь может это четко объяснить?
Ответ №1:
То, что вы пытаетесь сделать, называется множественным присваиванием в Python. Рассмотрим следующие коды:
[print(0)][0], [print(1)][0] = print(2), print(3)
Выводит:
2
3
0
1
[print(0)][0] = [print(1)][0] = [print(2)][0] = [print(3)][0]
Выводит:
3
0
1
2
Возможно, вы обнаружили, что для любого из этих назначений правые операнды сначала вычисляются слева направо, а затем переходят к левым операндам.
Это работает так же, как и в предоставленном вами коде.
i = 1
nums = [-1, 4, 3, 1]
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
В правой части nums[nums[i]-1]
вычисляется nums[3]
как равное, что дает целое 1
число, а затем nums[i]
вычисляется nums[1]
как равное, что дает целое число 4 .
Теперь настала очередь присваивать значения для левых операндов. На данный момент nums[i]
ссылается на nums[1]
, таким образом 1
, присваивается nums[1]
. Обратите внимание, что nums[1]
1
теперь равно, а затем интерпретатор находит, что nums[nums[i]-1]
ссылается на nums[1-1]
то, что есть nums[0]
! Затем 4
присваивается nums[0]
, давая вам результат [4, 1, 3 ,1]
.
Однако, если вы переключите операнды, порядок этого множественного присваивания изменится, и результат будет другим. Аналогично, процесс оценки выглядит следующим образом:
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, nums[nums[i]-1]
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, 1
nums: [-1, 4, 3, 1]
nums[3], nums[i] = 4, 1
nums: [-1, 4, 3, 4]
nums[i] = 1
nums: [-1, 1, 3, 4]