Python – разница между объявлением значения переменной в функции Фибоначчи

Я вроде новичок в питоне. Я искал один из типов, чтобы сделать функцию Фибоначчи,

def fib(n):
a=0
b=1
while a<n:
    print a
    a,b=b,a+b

и я видел объявление a,b=b,a+b. Итак, я подумал, что a=b и b=a+b совпадают с a,b=a,b+a, поэтому я изменил функцию, чтобы она была такой:

def fib(n):
a=0
b=1
while a<n:
    print a
    a=b
    b=a+b

и я думал, что это будет правильно, но когда я выполнил программу, я получил другой результат. Может ли кто-нибудь объяснить мне разницу между этими двумя типами объявлений?

Спасибо, в любом случае.


person user1713117    schedule 12.11.2012    source источник


Ответы (4)


b, a+b создает кортеж, содержащий эти два значения. Затем a, b = ... распаковывает кортеж и присваивает его значения переменным. Однако в вашем коде вы перезаписываете значение первого, поэтому во второй строке используется новое значение.

a, b = b, a + b

примерно равно:

tmp = a
a = b
b = tmp + b
person ThiefMaster    schedule 12.11.2012

Когда Python выполняется

a,b = b, a+b

он сначала оценивает правую часть, затем распаковывает кортеж и присваивает значения a и b. Обратите внимание, что a+b справа использует старые значения для a.

Когда Python выполняется

a=b
b=a+b

он оценивает b и присваивает его значение a. Затем он оценивает a+b и присваивает это значение b. Обратите внимание, что теперь a+b использует новое значение для a.

person unutbu    schedule 12.11.2012

Этот синтаксис одновременно присваивает новые значения a и b на основе текущих значений. Причина неэквивалентности заключается в том, что когда вы пишете два отдельных оператора, второе присваивание использует новое значение a вместо старого значения a.

person Adam Rosenfield    schedule 12.11.2012

В первом примере a не обновляется, чтобы принять значение b, пока вся строка не будет оценена, поэтому b на самом деле равно a + b.

В вашем примере вы уже установили a на b, так что последняя строка (b=a+b) может так же легко быть b=b+b.

Это все в том порядке, в котором вещи оцениваются.

person jbsmith    schedule 12.11.2012