2015-01-13 2 views
4

У меня есть список, и мне нужно поменять первый элемент в списке с максимальным элементом в списке.Перемещение элементов в списках в python

Но почему же код 1 работа, а код 2 не будет:

Код 1:

a = list.index(max(list)) 
list[0], list[a] = list[a], list[0] 

код 2:

list[0], list[list.index(max(list))] = list[list.index(max(list))], list[0] 

Я думал, Python сначала оценить правшей перед тем как назначить его именам слева?

+1

Я немного озадачен агрессивным путём по этому вопросу. Это действительно озадачивающее поведение, если вы не знаете, что происходит с порядком оценки целевых заданий. –

+0

@MartijnPieters Именно поэтому я был очень удивлен тем, как люди ведут себя, только потому, что у этого бедного парня 10 репутации, и это наверняка ново для программирования и на этом сайте. – nbro

+0

@MartijnPieters Может быть, но я думаю, что люди занижены из-за отсутствия исследований. – simonzack

ответ

5

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))] присваивается первой.

+1

Другими словами, 'list [list.index (max (list))], list [0] = list [0], list [list.index (max (list))]' работает как ожидалось. – xnx

Смежные вопросы