Python a,b=b,a+;B
这是我的第一个问题,我开始学习Python。 以下两者之间是否有区别:Python a,b=b,a+;B,python,Python,这是我的第一个问题,我开始学习Python。 以下两者之间是否有区别: 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 而a
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
而a
及
def fib(n):
a、 b=0,1
而a
行:
a, b = b, a + b
更接近:
temp_a = a
a = b
b = temp_a + b
其中,b
使用a
的旧值,然后将a
重新分配给b
的值
Python首先计算右侧表达式并将结果存储在堆栈上,然后获取这两个值并将它们分配给a
和b
。这意味着a+b
是在a
更改之前计算的
请参阅,了解字节码级别上所有表达式的工作原理。在
a,b=b,a+b
中,在将右侧的表达式分配到左侧之前,将对其进行求值。因此,它相当于:
c = a + b
a = b
b = c
old_a = a
old_b = b
c = old_a + old_b
a = old_b
b = c
在第二个示例中,
a
的值在运行b=a+b
时已经改变。因此,结果是不同的。假设我们从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.
我希望您没有受到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,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
因此,它相当于:
c = a + b
a = b
b = c
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
,a、b=b、a+b和a=b=a+b之间存在差异
让我们看一下以下两个示例:
eg1:
a,b=0,1
一会儿
a,b = 0,1
while a<10:
print(a)
a,b = b,a+b
#output:
0
1
1
2
3
5
8
a,b = 0,1
while a<10:
print(a)
a=b
b=a+b
#output:
0
1
2
4
8