我不确定这个问题的适当方向是什么,这也是一个重复的问题。所以请相应指导。
我是python编程的新手。我有这个简单的代码来生成Fibonacci系列。
1: def fibo(n):
2: a = 0
3: b = 1
4: for x in range(n):
5: print (a, end=' ')
6: #a, b = b, a+b
7: a = b
8: b = a+b
9: print()
10: num = int(input("enter n value: "))
11: print(fibo(num))
如果我按原样执行上面的代码,我得到的结果如下
enter n value: 10
0 1 2 4 8 16 32 64 128 256
如果取消注释#6和注释行#7和#8,我得到的结果是实际的fibo系列。
enter n value: 10
0 1 1 2 3 5 8 13 21 34
我想知道它们之间有什么区别
a, b = b, a + b
和
a = b
b = a + b
使用的编程IDE:PyCharm Community 2017.3
a = b
b = a + b
实际上是:
a = b
b = b + b
你想要的是:
a = b
b = old_value_of_a + b
当你做a, b = b, a + b
它真的在做:
tmp_a = b
tmp_b = a + b
a = tmp_a
b = tmp_b
这就是你想要的
在第7行中,您已经将b
中的值赋给a
,因此在第8行中,b
的新值实际上是旧b值的两倍。
在第6行中,=
右侧的值将使用旧值,这就是为什么你可以得到Fibo系列。
Assignment Statements将源变量的引用分配给目标变量。让我们通过一个例子来了解更多
>>> a = 5
>>> b = 6
>>> a = b
在这个例子中,b
是源变量,a
是目标变量。现在这两个变量的内存地址是相同的。我们也可以证实这一点
>>> hex(id(a)), hex(id(b))
>>> ('0x1002739e0', '0x1002739e0')
确认这一点的另一个测试是使用is算子
>>> a is b
>>> True
现在回到你的榜样。第一个声明
>>> a, b = b, a + b
Assignes b
到a
和(a+b)
到b
。这发生在单个操作中,因此两个变量都不同。我们可以应用上述测试来证实这一点
>>> a is b
>>> False
>>> hex(id(a)), hex(id(b))
>>> ('0x1002739e0', '0x2008739t0')
第二个声明
>>> a = b
>>> b = a + b
Assignes b
到a
然后(a+b)
到b
。这是两个不同的陈述,所以在第一步a
和b
已经相同。因此,第二个陈述相当于b = b + b
。
思想简单,所以如果你使用这种语法,任何人都可以理解它
a = 10
b = 20
a = b
b = a+b
print (a)
print (b)
在最初分配a = 10后,它将分配a = 20,因为python是动态类型语言,它将变量a的值从10更改为20,因此结果将类似
a=20
b=40
但如果我们使用
a = 10
b = 20
a,b = b,a+b
print (a)
print (b)
这将在一行中分配值,因此a和b的值将从它在其上面初始化的内容中精确使用,结果将类似于哪个是正确的解决方案
a=20
b=30
我认为#
线是pythonic解决方案。但如果你感到困惑,你可以使用一个临时的变量。您可以在之前指定值temp
,然后您可以更改值