Python a, b = b, a +b

24
这是我的第一个问题,我开始学习Python。 这两个之间有什么区别:
a, b = b, a + b

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个回答

46

a, b = b, a + b 中,右侧的表达式在被赋值给左侧之前会被先进行求值。因此这等同于:

c = a + b
a = b
b = c

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


20

这行代码:

a, b = b, a + b

更接近于:

temp_a = a
a = b
b = temp_a + b

b使用a旧值,这是在a被重新分配给b的值之前。

Python首先计算右侧表达式并将结果存储在堆栈上,然后将这两个值分配给ab。这意味着在改变a之前就计算了a + b

请参见如何在字节码级别上交换元组成员(a,b)=(b,a)?以获取有关所有操作的详细信息。


13

假设我们从这样的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.

1

让我们来理解它。

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 的旧值,
b 交换以获取旧值 a 和旧值 b 的和。


0
"

a, b = b, a + b类似于a,b = 0,1将值同时赋给两个变量a,b。首先将a=b,然后b=a+b。"


0
希望你没有被C语言的影响所左右,其中赋值运算符“=”的优先级高于逗号运算符“,”。不要认为它是“(a), (b = b), (a + b)”这样的形式,它是一个元组赋值,意思是“(a, b) = (b, a + b)”这样的形式。

0

在编程中,a,b=b,a+b和a=b,b=a+b之间存在差异。
我们来看下面的两个例子:

例子1:

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

#output:
0
1
1
2
3
5
8

例子2:

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

这是因为解释器总是先计算等号右侧的数字。只有当等号右侧的所有计算都完成后,计算结果才会被赋值给左侧的变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接