Python a,b = b,a + b

时间:2014-02-24 14:40:59

标签: python

这是我的第一个问题,我开始学习Python,所以我只想问。 是否有区别:

a, b = b, a + b

and

a = b
b = a + b

当你在下面的例子中写下它时会显示不同的结果。

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

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

7 个答案:

答案 0 :(得分:31)

a, b = b, a + b中,右侧的表达式在分配到左侧之前进行评估。所以它相当于:

c = a + b
a = b
b = c

在第二个示例中,a的值在运行b = a + b时已经更改。因此,结果是不同的。

答案 1 :(得分:14)

该行:

a, b = b, a + b

更接近:

temp_a = a
a = b
b = temp_a + b

其中ba重新分配给a之前使用b值。

Python首先评估右侧表达式并将结果存储在堆栈中,然后获取这两个值并将它们分配给ab。这意味着{<1}}在 a + b更改之前计算

在字节码级别,请参阅How does swapping of members in the python tuples (a,b)=(b,a) work internally?,了解这一切的工作原理。

答案 2 :(得分:8)

假设我们从ab这样开始:

a = 2
b = 3

所以,当你这样做时:

a, b = b, a + b

您要创建元组(b, a + b)(3, 5),然后将其解压缩到ab,以便a成为3b变为5

在你的第二个例子中:

a = b
# a is now 3
b = a + b
# b is 3 + 3, or 6.

答案 3 :(得分:0)

我希望你没有受到C语言的影响,C语言的赋值运算符=的优先级高于逗号运算符,的优先级。不要以为它是(a), (b = b), (a + b)。它是一个元组赋值,意思是(a, b) = (b, a + b)

答案 4 :(得分:0)

Down类似于 0 < 1 == True Down 0 < Down 1 == False 0 > 1 == False Down 0 > Down 1 == True 同时为两个变量a, b = b, a + b分配值。首先分配a, b = 0, 1,然后分配a, b

答案 5 :(得分:0)

让我们试试吧。

a, b = b, a + b

这是一个元组分配,意思是(a, b) = (b, a + b),就像(a, b) = (b, a)

一样

从一个简单的例子开始:

a, b = 0, 1
#equivalent to
(a, b) = (0, 1)
#implement as
a = 0
b = 1

(a, b) = (b, a + b)时 EAFP,直接尝试

a, b = 0, 1
a = b #a=b=1
b = a + b #b=1+1
#output
In [87]: a
Out[87]: 1
In [88]: b
Out[88]: 2

然而,

In [93]: a, b = b, a+b
In [94]: a
Out[94]: 3
In [95]: b
Out[95]: 5

结果与第一次尝试不同。

因为Python首先评估右手a+b 所以它相当于:

old_a = a
old_b = b
c = old_a + old_b
a = old_b
b = c

总之,a, b = b, a+b表示,
a进行交换以获得b的old_value,
b次交换获取旧值a和旧值b的总和,

答案 6 :(得分:0)

a,b = b,a + b和a = b b = a + b之间存在差异
让我们看一下以下两个示例:

eg1:

a,b = 0,1
while a<10:
  print(a)
  a,b = b,a+b

#output:
0
1
1
2
3
5
8

eg2:

a,b = 0,1
while a<10:
  print(a)
  a=b
  b=a+b
#output:
0
1
2
4
8

这是因为解释器始终首先计算等号右侧的数字。仅当所有计算都在右侧完成后,计算结果才会分配给左侧的变量。