Python(Fibo系列):试图理解a,b = b,a + b OR a = b& s之间的区别。 a = a + b

时间:2018-01-03 06:15:38

标签: python python-3.x

我不确定这个问题的适当方向是什么,这也是一个重复的问题。所以请相应指导。

我是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

5 个答案:

答案 0 :(得分:6)

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

这就是你想要的

答案 1 :(得分:4)

在第7行中,您已经将b中的值分配给a,因此在第8行中,b的新值实际上是原来的两倍b&#39 ; s值。

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

答案 2 :(得分:2)

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 

指定ba(a+b)b。这发生在单个操作中,因此两个变量都不同。我们可以应用上述测试来确认这个

>>> a is b
>>> False

>>> hex(id(a)), hex(id(b))
>>> ('0x1002739e0', '0x2008739t0')

第二个陈述

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

b指定为a,然后指定(a+b)指向b。这是两个不同的陈述,因此第一步ab已经相同。因此,第二个陈述等同于b = b + b

答案 3 :(得分:0)

思想简单,任何人都可以理解它 如果你使用这种语法

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

答案 4 :(得分:0)

我认为... parrots.find({ age: { $gt: parseInt(process.argv[2]) } }, { fields: { name: 1, age: 1, _id: 0 } }) ... 行是pythonic解决方案。但如果你感到困惑,你可以使用一个临时的变量。您可以先分配值#,然后可以更改值