def fibonacci(x):
a=0
b=1
for i in range(x-1):
b, a = a+b, b
return b
x = input ("Give me the number! ")
print "The",x,". Fibonacci number: "
print fibonacci (x)
所以代码完全正常,但我不明白,b,a=a+b,b
行,那么这是做什么的?:S
答案 0 :(得分:6)
在python中,b, a = a + b, b
在将新值分配给变量之前自动存储中间tuple
分解Python的指令,b, a = a + b, b
正在执行此反汇编:
5 17 LOAD_FAST 1 (b)
20 LOAD_FAST 0 (a)
23 LOAD_FAST 1 (b)
26 BINARY_ADD
27 ROT_TWO
28 STORE_FAST 0 (a)
31 STORE_FAST 1 (b)
从更简单的意义上讲,这是一个过程:
temp_tuple = (a + b, a)
b, a = temp_tuple
这个答案是从我的另一个答案的一部分复制而来的:https://stackoverflow.com/a/21585974/3130539
答案 1 :(得分:1)
Python支持多种不同形式的多重赋值。特别是,
>>> a = b = c = 1
>>> a
1
>>> b
1
>>> c
1
和
>>> a, b, c, *the_rest = list(range(10))
>>> a
0
>>> b
1
>>> c
2
>>> the_rest
[3, 4, 5, 6, 7, 8, 9]
所以你所拥有的相当于:
tmp = b
b = a+b
a = tmp
答案 2 :(得分:0)
与基本交换习语类似,它基本上就像执行以下操作:
tmp = b
b = a + b
a = tmp
答案 3 :(得分:0)
Python将右侧表达式与左侧赋值分开。首先评估右侧,并将结果存储在堆栈中,然后使用从堆栈中重新获取值的操作码分配左侧名称。
>>> import dis
>>> def foo(a, b):
... a, b = b, a
...
>>> dis.dis(foo)
2 0 LOAD_FAST 1 (b)
3 LOAD_FAST 0 (a)
6 ROT_TWO
7 STORE_FAST 0 (a)
10 STORE_FAST 1 (b)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
它的工作方式与其他任何拆包工作类似。
首先,创建由b和a的值组成的元组。然后将这个元组解压缩到a和b中,有效地交换它们。
>>> a=5
>>> b=6
>>> a,b = b,a
>>> a
6
>>> b
5
现在使用此属性,将生成Fibonacci序列。