Разница между определением нескольких переменных одновременно и по отдельности

#python #python-3.x

#python #python-3.x

Вопрос:

Я новичок в Python и пытаюсь изучить Python с помощью самообучения. Я пытался построить ряд Фибоначчи, используя while цикл. Вот мой код, который не возвращает желаемый результат. Кто-нибудь может объяснить проблему?

 a = 0
b = 1

while b<100:
    print(b)
    a = b
    b = a   b
  

Если мы определяем a, b одновременно, как a, b = b, a b , это работает отлично. Почему это происходит? Я не понимаю, потому что в обоих случаях я определяю a и b одинаково.

Ответ №1:

Это потому, что языки программирования, такие как Python и многие другие, выполняют инструкции, которые вы пишете, в том порядке, в котором вы их пишете.

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

Простым способом решить эту проблему было бы использование третьей переменной для временного сохранения результатов.

 a = 0
b = 1
c = 1

while c < 100:
    print(c)
    c = a   b
    a = b
    b = c

  

Ответ №2:

Вы допускаете одну небольшую ошибку.

Когда вы это делаете a = b , вы меняете значение a . После этого, когда вы делаете b=a b , это фактически эквивалентно b = b b => b=2b .

Чтобы избежать этого, используйте временную переменную temp и храните в ней значение a . Затем измените значение a с помощью a = b . Затем выполните, a = a b .

Ниже приведен код:

 a=0
b=1

while b<100:
    print(b)

    temp = a
    a = b
    b = temp b
  

Когда вы это делаете a, b = b, a b , предыдущее значение a используется для вычисления нового b , мы проделали аналогичную вещь выше, сохранив предыдущее значение a в temp

Комментарии:

1. Спасибо за объяснение и предоставление концепции временной переменной

2. Пожалуйста, примите ответ, если он был полезен… Рад помочь! =)

Ответ №3:

Оператор «запятая» ( , ) в Python используется для создания кортежа, и допускается опускать круглые скобки, которые окружают кортеж. Выражение a, b = b, a b на самом деле является присвоением одного кортежа другому:

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

Этот оператор выполняется путем вычисления конструктора кортежей с правой стороны (b, a b) . На этом этапе создается новый анонимный кортеж (назовем его c ), и исходные значения a и b больше не нужны. Затем кортеж поэлементно присваивается кортежу с левой стороны. Новое значение a становится c[0] (то есть прежним b ), а новое значение b становится c[1] (то есть бывшим a b ).

Комментарии:

1. Спасибо за концепцию определения кортежа с использованием оператора запятой без круглых скобок

Ответ №4:

Ваш код не работает, потому что вы изменяете значение a перед вычислением b . В ряду Фибоначчи требуется предыдущее значение a и b. Вы можете использовать list , как указано выше, или можете ввести другую переменную для хранения значений.

 while True:
    temp = a   b
    if temp >100:
        break
    print(temp)
    a = b
    b = temp
  

Для справки, вот простая реализация с использованием list :

 lst = [0, 1]
while True:
    temp = lst[-1] lst[-2]
    if temp>100:
        break
    lst.append(temp)

print(lst)