Подтвердить что ты не робот

Множественное назначение и порядок оценки в 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 во втором

4b9b3361

Ответ 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", и нам не нужно их беспокоиться.