Вопрос о назначении переменной Python - PullRequest
4 голосов
/ 26 июня 2011
a,b = 0,1 
while b < 50:
    print(b)
    a = b
    b = a+b

выходы:

1
2
4
8
16
32

wheras:

a,b = 0,1 
while b < 50:
    print(b)
    a,b = b, a+b

выходы (правильная последовательность Фибоначчи):

1
1
2
3
5
8
13
21
34

Разве они не одинаковы?Я имею в виду a,b = b, a+b по сути то же самое, что a = b и b = a+b, написанные отдельно - нет?

Ответы [ 6 ]

11 голосов
/ 26 июня 2011

Нет, они не совпадают.

Когда вы пишете a,b = b, a+b, назначения выполняются "одновременно".a,b = b, a+b совпадает с (a, b) = (b, a+b).Итак, после

a, b = 5, 8

a = 5 и b = 8.Когда Python видит это

(a, b) = (b, a+b)

, он сначала вычисляет правую сторону (b, a+b), равную (8,13) , а затем назначает (этот кортеж) левой стороне , до (a,b).


Если у вас есть: a = b и затем b = a+b, две операции выполняются одна за другой.Но для каждого из них:

a = b

Это сначала вычисляет правую сторону b , а затем присваивает (это значение) левой стороне , чтобыa.И снова

b = a + b

Это сначала вычисляет правую сторону a + b , а затем присваивает (это значение) левой стороне , b.

5 голосов
/ 26 июня 2011

Эти операторы отличаются.

a = b
b = a+b

изменяет a, а затем использует измененное значение для изменения b.На самом деле, он всегда b = b + b.

a,b = b, a+b

меняет b и a в один и тот же момент, поэтому b рассчитывается с использованием исходного значения a.

5 голосов
/ 26 июня 2011

Они не одинаковы.В первом примере a присваивается значение b, а затем его новое значение добавляется к b.Фактически b + b.

Во втором примере a назначается текущее значение b, а b назначается текущее значение a плюс текущее значение b.Это происходит до того, как значение a изменится.

Два назначения происходят одновременно, а не последовательно.

3 голосов
/ 26 июня 2011

Для этого:

a,b = b, a+b

все с правой стороны сначала оценивается, а затем присваивается левой стороне.Таким образом, вы используете значение a с правой стороны, прежде чем присвоение a с левой стороны изменит его.

Для этого:

a = b
b = a+b

значение aизменяется до выполнения второго оператора.Так что ваши результаты разные.

1 голос
/ 26 июня 2011

Во втором примере представлен кортеж, используемый для выполнения «одновременных» назначений.

(A,B)=(B,A+B)

Кортежи являются неизменяемыми, что означает, что их содержимое не может быть изменено после установки.Кроме того, Python обрабатывает назначения справа налево.Поэтому, когда кортеж справа создан, значения не могут измениться, даже если A & B присвоены новые значения слева.

0 голосов
/ 24 марта 2014

Как две операции присваивания выполняются одновременно:

a,b = b,a+b: сначала в фоновом режиме, я думаю, python назначает a+b переменной, давайте назовем ее x и присваиваем bпеременная, назовем ее y, затем присваиваем x b и y a.

Я думаю, что понятие «одновременно» неверно по логике, значениеa в памяти необходимо сначала изменить, затем b или наоборот, поэтому значение a по-прежнему зависит от b или наоборот, если нет других переменных для хранения новых значений, как указано выше.

...