Это задание делает довольно много.Давайте разберемся со всем ...
a = [1, 2, 3, 4, 5]
Хорошо, это легко.Далее:
a[0], a[a[0]] = a[a[0]], a[0]
Первое, что происходит в любом задании, - это оценка правой части, поэтому:
a[a[0]], a[0]
уменьшается до a[1], a[0]
, что оценивается до (2, 1)
.
Затем каждая цель назначения по очереди получает один из этих предметов с назначенной ей правой стороны:
a[0] = 2 # 2 == first item in the (already evaluated) right hand side
Теперь все готово, a
выглядит следующим образом:
[2, 2, 3, 4, 5]
Теперь мы выполним второе задание:
a[a[0]] = 1 # 1 == second item in the (already evaluated) right hand side
Но подождите!a[0]
теперь 2
, так что это сокращается до
a[2] = 1
И, о чудо, если мы посмотрим на a
снова, это закончится как:
[2, 2, 1, 4, 5]
Вы обнаружили, что хотя Python утверждает, что он может поменять два значения одновременно, например, a, b = b, a
, это не совсем так.На практике это почти всегда работает, но если одно из значений является частью описания другого - в этом случае a[0]
является частью описания a[a[0]]
- детали реализации могут сбить вас с толку.
Способ исправить это - сохранить начальное значение a[0]
до того, как вы начнете переназначать вещи:
a = [1, 2, 3, 4, 5]
tmp = a[0]
a[0], a[tmp] = a[tmp], a[0]
После чего a
выглядит так, как вы ожидаете:
[2, 1, 3, 4, 5]