繁体   English   中英

蟒蛇 a, b = b, a +b

[英]Python a, b = b, a +b

这是我的第一个问题,我开始学习 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)

a, b = b, a + b ,右侧的表达式在分配给左侧之前先求值。 所以它等价于:

c = a + b
a = b
b = c

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

线路:

a, b = b, a + b

更接近于:

temp_a = a
a = b
b = temp_a + b

其中b是使用的aa被再分配的值b

Python 首先计算右边的表达式并将结果存储在堆栈中,然后获取这两个值并将它们分配给ab 这意味着, a + b之前计算a被改变。

请参阅python 元组 (a,b)=(b,a) 中成员的交换如何在内部工作? 在字节码级别详细了解这一切是如何工作的。

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

让我们来了解一下。

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的总和,

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

a, b = b, a + b类似于a, b = 0, 1同时为变量a, b赋值。 首先分配a = b然后b = a + b

a,b = b,a+b 和 a=bb=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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM