2015-10-18 2 views
2

Я написал сценарий для серии Фибоначчи с назначением однострочной переменной и назначением переменной переменной строки. У меня две разные результатыВ python какая разница между назначением переменной в одной строке и назначением переменной в нескольких строках

Несколько линий:

class fibonacci: 
    def fib(self,num): 
     result = [] 
     a = 0 
     b = 1 
     while a < num: 
      result.append(a) 
      a = b 
      b = a + b 
     return result 

instance = fibonacci() 
new_inst = instance.fib(100) 
print new_inst 

выход:

[0, 1, 2, 4, 8, 16, 32, 64] 

Заказать Изменено:

class fibonacci: 
    def fib(self,num): 
     result = [] 
     b = 1 
     a = 0 
     while a < num: 
      result.append(a) 
      b = a + b 
      a = b 
     return result 

instance = fibonacci() 
new_inst = instance.fib(100) 
print new_inst 

Выход:

[0, 1, 2, 4, 8, 16, 32, 64] 

Одна линия:

class fibonacci: 
    def fib(self,num): 
     result = [] 
     a,b = 0,1 
     while a < num: 
      result.append(a) 
      a,b = b, a + b 
     return result 

instance = fibonacci() 
new_inst = instance.fib(100) 
print new_inst 

выход:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 

ответ

3

Единственное отличие состоит в порядок вычисления. При назначении

a, b = b, a + b 

Правые выражения вычисляются полностью перед тем назначением на левой стороне, так что порядок оценки является:

foo = a + b 
bar = a 
b = foo 
a = bar 

Это отличается от порядка оценки в вашей первый пример, который составляет:

a = b 
b = a + b 

Следовательно, ваши два примера дают разные результаты.

Чтобы обойти проблему, я бы, вероятно, использовать:

c = a 
a = b 
b = a + c 

Это генерирует правильный вывод по желанию.

+0

класса 'Фибоначчи: Защиту FIB (сам, Num): результата = [] а, б = 0,1 в то время как <число: result.append (а) Ь = а + Ь = б возвращаемый результат экземпляр = Фибоначчи() new_inst = instance.fib (100) печати new_inst', но все еще я получил тот же результат: [0, 1, 2, 4, 8, 16, 32, 64] – user60679

+0

Я изменил порядок, но все же у меня есть два разных выхода – user60679

+0

Обновлено @ user60679 – gtlambert

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