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

问题描述 投票:4回答:5

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

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

python python-3.x
5个回答
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

这就是你想要的


4
投票

在第7行中,您已经将b中的值赋给a,因此在第8行中,b的新值实际上是旧b值的两倍。

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


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 

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

>>> a is b
>>> False

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

第二个声明

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

Assignes ba然后(a+b)b。这是两个不同的陈述,所以在第一步ab已经相同。因此,第二个陈述相当于b = b + b


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

0
投票

我认为#线是pythonic解决方案。但如果你感到困惑,你可以使用一个临时的变量。您可以在之前指定值temp,然后您可以更改值

© www.soinside.com 2019 - 2024. All rights reserved.