Python хранит результаты с несколькими целями от слева направо, выполняя назначение целевого выражения в этом порядке.
Так что ваша вторая версия, по существу сводится к следующему:
temp = list[list.index(max(list))],list[0]
list[0] = temp[0]
list[list.index(max(list))] = temp[1]
Обратите внимание, что list.index(max(list))
выполняется послеlist[0]
была изменена, и это, где вы просто хранить максимальное значение.
Это отражено в Assignment statements documenation:
- Если целевой список является запятой список целей: Объект должен быть итерацию с тем же числом элементов, поскольку есть цели в целевой список, и пункты назначены, слева направо, к соответствующим целям.
оттуда на это, как если бы каждая цель является одной цели, поэтому документация, которая следует относится слева направо каждой цели:
Назначение объекта к одной target рекурсивно определяется следующим образом.
[...]
- Если цель подписка: Первичное выражение в ссылке оценивается. Он должен давать либо изменяемый объект последовательности (например, список), либо объект сопоставления (например, словарь). Затем оценивается выражение индекса.
Если вы изменили порядок назначений ваш код будет работать:
list[list.index(max(list))], list[0] = list[0], list[list.index(max(list))]
, потому что теперь list[list.index(max(list))]
присваивается первой.
Я немного озадачен агрессивным путём по этому вопросу. Это действительно озадачивающее поведение, если вы не знаете, что происходит с порядком оценки целевых заданий. –
@MartijnPieters Именно поэтому я был очень удивлен тем, как люди ведут себя, только потому, что у этого бедного парня 10 репутации, и это наверняка ново для программирования и на этом сайте. – nbro
@MartijnPieters Может быть, но я думаю, что люди занижены из-за отсутствия исследований. – simonzack