2013-02-18 10 views
0

Я работаю над Project euler, но это не относится к делу. Я пишу быстрый код для распечатки последовательности Фибоначчи. Я на самом деле имеют разный код для eueler уравнения проекта, но это, по сути, алгоритм я использую:Почему этот код работает только тогда, когда я использую 'x, y = y, x + y format вместо' x = y; y = x + y '?

x = 1 
y = 0 
while x < 4000000: 
    print x 
    x = y 
    y = x + y 

Это erking меня на некоторое время, это должно было сработать. Затем я немного исследовал и нашел практически тот же код, но немного отличался от формата. И это сработало! Единственное различие заключалось в том, что он помещал назначения x и y в одну строку, разделенную запятой. Поэтому я попробовал:

x , y = 1 , 0 
while x < 4000000: 
    print x 
    x,y = y, x + y 

Очевидно, что, как я уже сказал, это сработало. Это действительно беспокоит меня, поскольку я не могу понять, какая разница между этими двумя, кроме умных и использующих меньше строк во втором. Я не могу понять, почему результат отличается. Почему выход отличается?

ответ

6

В вашем первом коде:

x = y 
y = x + y 

Вы фактически назначаете y + y на номер y. Поскольку значение x уже перезаписано. И это вам не нужно?


И в вашей 2-й код:

x, y = y, x + y 

Первый y и x + y на RHS оценивается, а затем оценочное значение присваивается x, y на LHS. Таким образом, x + y не будет иметь побочного эффекта вновь назначенного значения до x, как это было в первом случае. Итак, ваш y будет иметь только x + y.

Итак, это как раз случай evaluation обоих этих выражений на RHS, прежде чем фактическое назначение будет выполнено.

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

0

Я бы предположил, что во второй версии, когда он оценивает y, x+y, он использует исходное значение x в x + y.

В версии две линии, когда он оценивает x+y х был установлен у, что приводит к й + у такого же, как y+y

+0

Я домысливать то же самое, что означало бы, что последняя строка оценивается как y = 0 + 0. Я думаю, что если вы замените последние 2 строки в оригинале последней строкой в ​​рабочей версии, обе версии w ould работает должным образом. –

0

Вы переназначить х.

Возьмем числовой пример

Случай 1:

x = 4 
y = 2 
x = y = 4 
y = x + y = 4 + 4 = 8 

Случай 2:

x = 4 
y = 2 
x, y = y, x + y = 2, 4 + 2 = 2, 6 

Таким образом, в первом случае х равен 4 и у равно 8, а во втором случай x равен 2 и y равно 6.

0

В первой версии первое присваивание изменяет значение x.Это влияет на значение в задании на следующей строке. Это означает, что y = x + y больше похож на y = y+y, потому что вы уже изменили x.

Во второй версии оба назначения выполняются одновременно, поэтому оба значения обновляются одновременно.

0

Это потому, что после строки x = y вторая строка (y = x + y) оценивается как y = y + y. Например, предположим, что х = 2 и у = 3.

Затем

x = y   # i.e. x = 3 now 
y = x + y  # i.e. y = 3 + 3 = 6 (while you wanted it to be 5) 

С другой стороны,

x, y = y, x + y # this first assigns values to the right hand side 

Итак,

x, y = 3, 2 + 3 # i.e x, y = 3, 5