Множественное назначение и порядок оценки в Python
В чем разница между следующими выражениями Python:
# First:
x,y = y,x+y
# Second:
x = y
y = x+y
Сначала дает разные результаты, чем второй.
например.
Во-первых:
>>> x = 1
>>> y = 2
>>> x,y = y,x+y
>>> x
2
>>> y
3
Во-вторых:
>>> x = 1
>>> y = 2
>>> x = y
>>> y = x+y
>>> x
2
>>> y
4
y равно 3 в первом и 4 во втором
Ответы
Ответ 1
В операторе присваивания правая часть всегда оценивается полностью, прежде чем выполнять фактическую настройку переменных. Таким образом,
x, y = y, x + y
оценивает y
(пусть вызывает результат ham
), оценивает x + y
(называет это spam
), затем устанавливает x
в ham
и y
в spam
. I.e, он, как
ham = y
spam = x + y
x = ham
y = spam
В отличие от этого,
x = y
y = x + y
устанавливает x
в y
, затем устанавливает y
в x
(который == y
) плюс y
, поэтому он эквивалентен
x = y
y = y + y
Ответ 2
Это объясняется в документах раздела Порядок оценки:
... при оценке присваивания, правая часть оценивается перед левой стороной.
Ответ 3
Первое выражение:
- Создает временный кортеж со значением
y,x+y
- Назначено в другой временный кортеж
- Извлеките кортеж в переменные
x
и y
Второй оператор на самом деле представляет собой два выражения без использования кортежей.
Удивительно, первое выражение на самом деле:
temp=x
x=y
y=temp+y
Вы можете узнать больше об использовании запятой в разделе Parenthesized forms".
Ответ 4
Во втором случае вы назначаете x+y
на x
В первом случае второй результат (x+y
) присваивается y
Вот почему вы получаете разные результаты.
После редактирования
Это происходит потому, что в заявлении
x,y = y,x+y
все переменные в правом члене оцениваются и затем сохраняются в левых членах. Итак, сначала продолжайте с правильным членом, а второй с левым элементом.
Во втором утверждении
x = y
y = x + y
yo сначала оценил y
и присвоил его x
; Таким образом, сумма x+y
эквивалентна сумме y+y
, а не x+x
, которая является первым случаем.
Ответ 5
Первый - это привязка к кортежу:
x,y = y,x+y
Где x
- первый элемент кортежа, а y
- второй элемент, поэтому вы делаете следующее:
x = y
y = x+y
Если второй выполняет прямое назначение:
x=y
x=x+y
Ответ 6
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b
Выход
1
1
2
3
5
8
переменные a и b одновременно получают новые значения 0 и 1, то же a, b = b, a + b, a и b назначаются одновременно.
Ответ 7
Обозначим разность.
x, y = y, x + y
Это x кортеж xssignment, mexns (x, y) = (y, x + y)
, точно так же, как (x, y) = (y, x)
Stxrt из x быстрого примера:
x, y = 0, 1
#equivxlent to
(x, y) = (0, 1)
#implement xs
x = 0
y = 1
Когда доходит до (x, y) = (y, x + y)
ExFP, попробуйте напрямую x
x, y = 0, 1
x = y #x=y=1
y = x + y #y=1+1
#output
In [87]: x
Out[87]: 1
In [88]: y
Out[88]: 2
Однако
In [93]: x, y = y, x+y
In [94]: x
Out[94]: 3
In [95]: y
Out[95]: 5
Результат отличается от первой попытки.
спасибо, потому что Python сначала оценивает правую x+y
Так что это равносильно:
old_x = x
old_y = y
c = old_x + old_y
x = old_y
y = c
Таким образом, x, y = y, x+y
означает,
x
обменивается, чтобы получить old_value y
,
y
обменивается, чтобы получить сумму старого значения x
и старое значение y
,
Ответ 8
Я недавно начал использовать Python, и эта "функция" сбила меня с толку. Хотя есть много ответов, я все равно отправлю свое понимание.
Если я хочу поменять значения двух переменных, в JavaScipt, я бы сделал следующее:
var a = 0;
var b = 1;
var temp = a;
a = b;
b = temp;
Мне понадобится третья переменная, чтобы временно удерживать одно из значений. Очень простой обмен не будет работать, потому что обе переменные будут иметь одинаковое значение.
var a = 0;
var b = 1;
a = b; // b = 1 => a = 1
b = a; // a = 1 => b = 1
Представьте себе наличие двух разных (красных и синих) ведер и двух разных жидкостей (воды и масла), соответственно.Теперь попробуйте поменять ведра/жидкости (вода в синем и масло в красном ведре).Вы не можете этого сделать, если у вас нет дополнительного ведра.
Python справляется с этим с помощью "более чистого" способа/решения: назначение Tuple.
a = 0
b = 1
print(a, b) # 0 1
# temp = a
# a = b
# b = temp
a, b = b, a # values are swapped
print(a, b) # 1 0
Я думаю, таким образом Python автоматически создает переменные "temp", и нам не нужно их беспокоиться.