Странное поведение, меняющее местами два элемента массива при индексации по элементам - PullRequest
1 голос
/ 24 апреля 2020

Я столкнулся со странным поведением, пытаясь обменять элементы массива.

Начальное состояние

i = 1
nums = [0, 1]

Что не сработало

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
print(nums) # [0, 1]

Что сработало

nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
print(nums) # [1, 0]

Я полагал, что оба выражения должны были иметь одинаковый результат, так как правая часть присваивания оценивается первой.

Проверено на Python 2.7.16 и Python 3.7. 6 в macOS Catalina, 10.15.4.

Примечание: nums[1], nums[0] = nums[0], nums[1] и nums[0], nums[1] = nums[1], nums[0] работают так, как и ожидалось.

1 Ответ

2 голосов
/ 24 апреля 2020

Это потому, что аргументы в левой части присваивания по-прежнему оцениваются слева направо. Давайте разберем нерабочий пример:

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

становится

nums[i], nums[nums[i]-1] = nums[0], nums[1]

становится

nums[i], nums[nums[i]-1] = 0, 1

теперь вычисляется левая часть, но nums[i] оценивается первым. Это превращает nums[1] в 0.

Теперь, если мы оценим nums[nums[i] - 1], мы увидим, что это дает nums[0 - 1], то есть nums[-1], то есть nums[1].

Так что все это выражение ничего не делает. Он просто устанавливает nums[1] на 0, а затем обратно на 1.

...