我找到了斐波那契序列的例子:
def fib(n):
a, b = 0, 1
while b < n:
print (b)
a, b = b, a+b
fib(20)
所以这就是我得不到的东西:
a, b = 0, 1 # is just a shortcut for writing
a = 0
b = 1
正确?
现在,遵循相同的逻辑
a, b = b, a+b #should be the same as writing
a = b
b = a+b
但这不是因为如果我这样写,输出就不同了。 我很难理解为什么。有什么想法吗?
答案 0 :(得分:3)
是的它不完全一样,因为当你写 -
a, b = b, a+b
考虑执行语句时a
和b
的值,在此语句之前说a=1
,b=2
,然后是第一个右侧计算后,计算b=2
并计算a+b=3
。然后进行分配,即为a
分配值2
,为b
分配值3
。
但是当你写作 -
a = b
b = a+b
分配与计算一起发生,即先计算b=2
,然后分配给a,所以a变为2,然后计算a + b(改变a的值),所以{{1并且它被分配给b,因此a+b=4
变为b
,因此也就是差异。
4
这是交换a,b = b, a
和a
值的简写,请注意,如果您想在不使用此表示法的情况下交换值,则需要一个临时变量。
内部如何工作是将右手sid制成元组,然后将值解压缩,这是一个简单的测试 -
b
答案 1 :(得分:1)
a, b = c, d
不是以下内容的简写:
a = c
b = d
它实际上是速记:
a, b = (c, d)
即,您正在创建一个元组(c, d)
,一个元组值为c
和d
,然后unpacked进入目标列表{ {1}}。在将值解压缩到目标列表之前创建具有其值的元组。它实际上是一个原子*操作,而不是几个操作的简写。因此,目标列表中的一个变量是否也出现在赋值操作的右侧并不重要。
* Not&#34; atomic&#34;在数据库ACID意义上,但仍然没有单独的陈述。
答案 2 :(得分:1)
这不是一回事。
x, y = y, x
等于:
t = x
x = y
y = t
它实际上使用临时变量来交换x
和y
。
回到a, b = b, a+b
。此表达式等于:
m = a; n = b
a = n
b = m + n