![](/img/trans.png)
[英]what is the difference between ['[a,a,a]','[b,b,b]'] and [[a,a,a],[b,b,b]] in python?
[英]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
是使用的旧值a
前a
被再分配的值b
。
Python 首先计算右边的表达式并将结果存储在堆栈中,然后获取这两个值并将它们分配给a
和b
。 这意味着, a + b
是之前计算a
被改变。
请参阅python 元组 (a,b)=(b,a) 中成员的交换如何在内部工作? 在字节码级别详细了解这一切是如何工作的。
假设我们像这样从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
的总和,
我希望你没有受到 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.