我不确定这个问题的适当方向是什么,这也是一个重复的问题。所以请相应指导。
我是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
答案 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
指定b
到a
和(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
。这是两个不同的陈述,因此第一步a
和b
已经相同。因此,第二个陈述等同于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解决方案。但如果你感到困惑,你可以使用一个临时的变量。您可以先分配值#
,然后可以更改值