5

这就是他们所拥有的:

def fib(n):
    a, b = 0, 1
    while a < n:
        print a,
        a, b = b, a+b

这就是我所拥有的:

def fib(n):
    a = 0
    b = 1
    while a < n:
        print a
        a = b
        b = b+a

第一个在使用时返回正确的序列,而我的继续 0, 1, 2, 4, 8, 16, 32...

我目前正在学习编程(没有以前的计算机科学教育),很明显问题在于我如何定义我的变量。用逗号分隔变量和用新行分隔变量有什么区别(假设这是问题所在)?

4

2 回答 2

8

这是一个元组赋值:

a, b = 0, 1

你也可以把它想象成

(a, b) = (0, 1)

使用值创建一个临时元组01然后将其解压缩到变量ab

这也是一个元组赋值

a, b = b, a+b

同样,您可以将其视为

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

临时元组是根据它们中的任何一个更新之前的值创建b的。分配仅在创建临时元组后发生。a+b

通过将其分解为单独的步骤,您正在改变代码的含义。

让我们看看这里发生了什么

a, b = 0, 1        # a=0 , b=1
a, b = b, a+b      # a=1 , b=1

与之比较

a = 0              # a=0
b = 1              # a=0 , b=1
a = b              # a=1 , b=1
b = b+a            # a=1 , b=2 
于 2013-03-20T05:29:41.737 回答
5

只有一个区别:

在第一个中,分配b = b+a是在修改之前完成的a。这是因为,在完成任何赋值之前,首先计算 RHS 中的表达式。

而在第二个中,第二个赋值是在修改a. 这就是为什么你看到错误的结果。

因此,在您的代码中:

b = b + a

实际上是:

b = b + b

因为a已经被赋予了 的值b

于 2013-03-20T05:20:56.717 回答