Python(Fibo系列):试图理解a,b=b,a+;b或a=b&;a=a+;B

Python(Fibo系列):试图理解a,b=b,a+;b或a=b&;a=a+;B,python,python-3.x,Python,Python 3.x,我不确定这个问题的适当标题是什么,这也可能是一个重复的问题。所以请相应地引导 我是python编程新手。我有这个简单的代码来生成斐波那契级数 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 = in

我不确定这个问题的适当标题是什么,这也可能是一个重复的问题。所以请相应地引导

我是python编程新手。我有这个简单的代码来生成斐波那契级数

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在第7行中,您已经将
b
中的值分配给
a
,因此在第8行中,
b
的新值实际上是旧b值的两倍

在第6行中,
=
右侧的值将使用旧值,这就是为什么可以得到Fibo系列

enter n value: 10
0 1 1 2 3 5 8 13 21 34 
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
这就是您想要的

将源变量的引用分配给目标变量。让我们通过一个例子来了解更多

>>> a = 5
>>> b = 6
>>> a = b
在本例中,
b
是源变量,
a
是目标变量。现在,这两个变量的内存地址相同。我们也可以证实这一点

>>> hex(id(a)), hex(id(b))
>>> ('0x1002739e0', '0x1002739e0')
确认这一点的另一个测试是使用操作员

现在回到你的例子。第一句话

>>> a, b = b, a + b 
 >>> a = b
 >>> b = a + b
b
分配给
a
(a+b)
分配给
b
。这是一个单独的操作,因此两个变量是不同的。我们可以应用上述测试来确认这一点

>>> a is b
>>> False

>>> hex(id(a)), hex(id(b))
>>> ('0x1002739e0', '0x2008739t0')
第二项声明

>>> a, b = b, a + b 
 >>> a = b
 >>> b = a + b

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
,然后可以更改值

这两个值在python中是相同的,在一个单独的文件中分配多个值更容易line@MidhunMohan这应该是一个答案,而不是评论。(无论如何,这是不正确的,但回答问题的内容应该作为答案发布。)@DavidZ我想给作者一个提示,这样他就可以提出更具体的问题,因为作者是个新手,我想给作者一些提示将有助于通过himself@MidhunMohan这是一个合理的想法,但问题是,你发布的内容是对问题的直接回答,而不仅仅是一个暗示。此外,这里的目标不仅仅是帮助提问者回答他们的问题,还包括为其他提出相同问题的人记录这些答案。提示对其他人没有多大帮助。@MidhunMohan是的。至少,下一次当你发现自己处于类似的情况时,要给出一个答案。(这一次,这并不重要。)这很有趣。因此a,b=b,a+b解释器将对各个值进行临时分配,然后对其进行处理。但有一部分仍然令人困惑,这其中的执行顺序是什么?如果先应用a=b,则值被正确替换?它将像往常一样首先计算
=
的右侧。右侧将创建一个值的元组(基本上是一对),然后分配给左侧。所以它字面上翻译成我在回答中写的,你可能想看看这个:。它是在右边建立一个元组,然后把它分配到左边。实际上,这可能是一个更好的链接:你的答案给了我一个完整的解释和理解。非常感谢你。抱歉,无法将您的回答也标记为答案。