python中单var赋值和多var赋值之间有什么不同的行为吗?

2024-04-20 09:43:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数可以打印斐波那契级数

def fib(n):
    """ print the fibonacci series up to n."""
    a, b = 0, 1
    while a < n:
      print(a)
      a, b = b, a + b

效果很好。但是,当我改变一些编码风格时,它并没有像我预期的那样工作。那么这里发生了什么?你知道吗

def fib(n):
    """ print the fibonacci series up to n."""
    a = 0
    b = 1
    while a < n:
       print(a)
       a = b
       b = a + b

上面的代码并没有打印出和第一个代码相同的结果,但我可以在两个函数中看到相同的代码。我是python的初学者。你知道吗


Tags: theto函数代码编码风格deffibonacci
2条回答

是的,有不同的行为。在将=右侧的所有内容分配到=左侧之前,对其进行求值。多重赋值只意味着在右边计算一个元组,然后在左边将它赋值给一个元组。你知道吗

a, b = b, a+b
# computes (b, a+b)
# matches with (a, b)
# assigns the computed values to a and b respectively

a = b
# assigns the value of b to a
b = a + b
# computes a + b (since a was just set equal to b, this is the same as b + b)
# assigns that computed value to b

如果需要将所有赋值都放在单独的行上,则需要一个临时保持变量来交换ab

temp = a
a = b
b = b + temp

或者做一些花哨的事情来保持ba之间的差异:

b = b + a
a = b - a

多重赋值是解决问题的“最正确”的方法,主要是因为它最简洁。你知道吗

在第二种方法中,您没有正确地交换值

直接的解决方案是:

def fib(n):
    a = 0
    b = 1
    while a < n:
        print(a)
        c = a + b   # c is the temporary variable
        a = b
        b = c

在第一种方法中,首先计算加法,然后a变成b,b变成附加值。而在第二种方法中,您将附加值存储在其他变量中,然后按照上面的代码交换值。你知道吗

相关问题 更多 >