2017-01-04 2 views
-1

Я тестирую скрипт python, где мне приходится постоянно хранить старые значения двух переменных, а затем возвращать их через функцию. Для этого я взял ряд Фибоначчи в качестве примера:Динамическое назначение переменной в Python

def fibonacci(n): 
    a=0;b=1;cnt=0; 
    while True: 
    if (cnt > n): 
     return; 
    yield a; 
    c=b;b=a+b;a=c; 
    cnt +=1; 

fib=fibonacci(5) 
for x in fib: 
    print(x,end=" ") 

Все работает отлично, как и ожидалось здесь, а выход также, как и ожидалось. Однако я попытался написать его по-другому, вместо того, чтобы использовать дополнительную переменную «c», я могу эффективно выполнять обмен старых значений, и я практически столкнулся с этим (хотя понятия не имею, как здесь работает задание):

Вместо линии:

c=b;b=a+b;a=c; 

использовано:

a,b=b,a+b 

Так подробное объяснение будет оценено.

+1

не помещать команды в одну строку 'c = b; b = a + b; a = c;' делает код нечитаемым для людей. – furas

+1

Это возможно, потому что python поддерживает [распаковка] (https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01s01.html) –

+1

запятая ',' используется для создания 'tuple' - поэтому вы «упаковываете» значения в кортеж 'b, a + b', а затем« распаковываете »этот кортеж в переменные' a, b' – furas

ответ

2

Это особенность Python.

>> a=1 
>> b=2 
>> a, b = b, a 
>> a, b 
>> (2, 1) 

Правая сторона задания - это выражение, которое создает новый кортеж. Другая сторона задания немедленно распаковывает этот (не привязанный) кортеж к именам a и b.

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

проверить это tuple and sequences

Надеется, что это помогает.

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