这是我的第一个问题,我开始学习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)
答案 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
其中b
在a
重新分配给a
之前使用b
的旧值。
Python首先评估右侧表达式并将结果存储在堆栈中,然后获取这两个值并将它们分配给a
和b
。这意味着{<1}}在 a + b
更改之前计算。
在字节码级别,请参阅How does swapping of members in the python tuples (a,b)=(b,a) work internally?,了解这一切的工作原理。
答案 2 :(得分:8)
假设我们从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.
答案 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
这是因为解释器始终首先计算等号右侧的数字。仅当所有计算都在右侧完成后,计算结果才会分配给左侧的变量。