这是我的第一个问题,我开始学习 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
时已经被改变,因此结果是不同的。
The line:
a, b = b, a + b
更接近:
temp_a = a
a = b
b = temp_a + b
其中,b
使用a
的旧值a
,然后将a
重新指定为b
的值。
Python 首先计算右边的表达式并将结果存储在堆栈上,然后取这两个值并将它们分配给a
和b
。这意味着a + b
是在a
更改之前计算的。
请参阅How does swapping of members in the python tuples (a,b)=(b,a) work internally?,了解在字节码级别上这一切是如何工作的。
假设我们从a
和b
开始,如下所示:
a = 2
b = 3
所以,当你这样做:
a, b = b, a + b
所发生的是,您创建元组(b, a + b)
或(3, 5)
,然后将其解压缩到a
和b
中,因此a
变为3
,b
变为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
的和,
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(14条)