Странные результаты при замене элементов в списке Python

#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]