Python变量赋值问题

时间:2011-06-26 16:32:18

标签: python variable-assignment fibonacci

a,b = 0,1 
while b < 50:
    print(b)
    a = b
    b = a+b

输出:

1
2
4
8
16
32

wheras:

a,b = 0,1 
while b < 50:
    print(b)
    a,b = b, a+b

输出(正确的斐波那契序列):

1
1
2
3
5
8
13
21
34

它们不一样吗?我的意思是a,b = b, a+b基本上与a = bb = a+b分开编写 - 不是吗?

6 个答案:

答案 0 :(得分:11)

不,他们不一样。

当您编写a,b = b, a+b时,分配将“同时”完成。 a,b = b, a+b(a, b) = (b, a+b)相同。所以,在

之后
a, b = 5, 8

a = 5且b = 8。当Python看到这个

(a, b) = (b, a+b)

首先计算右侧 (b, a+b) (8,13) ,然后将此元组分配给左侧,添加到{{ 1}}。


当你有:(a,b)然后a = b时,这两个操作将一个接一个地完成。但对于他们每个人:

b = a+b

首先计算右侧 a = b 然后将(此值)分配给左侧,分配给b。再次

a

首先计算右侧 b = a + b ,然后将此值(此值)分配给左侧,添加到a + b

答案 1 :(得分:5)

他们不一样。在第一个示例中,为a分配了值b,然后将其新值添加到b。有效b + b

在第二个示例中,为a分配了当前值b,并为b分配了当前值a加上当前值b。它发生在a的值发生变化之前。

这两项任务同时发生而不是顺序发生。

答案 2 :(得分:5)

这些陈述不同。

a = b
b = a+b

修改a,然后使用修改后的值更改b。实际上,它总是b = b + b

a,b = b, a+b

同一时间更改ba,因此使用原始b值计算a

答案 3 :(得分:3)

为此:

a,b = b, a+b

首先评估右侧的所有内容,然后将其分配到左侧。因此,在左侧的分配更改之前,您在右侧使用a的值。

为此:

a = b
b = a+b

在执行第二个语句之前更改a的值。所以你的结果是不同的。

答案 4 :(得分:1)

第二个示例表示用于执行“同时”分配的元组。

(A,B)=(B,A+B)

元组是不可变的,这意味着它们的内容一旦设置就无法更改。此外,Python从右到左处理分配。因此,当创建右边的元组时,即使A&amp; A值,也不会改变值。 B在左侧分配了新值。

答案 5 :(得分:0)

两个分配操作如何在同一时间完成:

a,b = b,a+b:首先在后台,我认为python会将a+b分配给变量,让我们称之为x并将b分配给变量让我们称之为y 1}}然后,将x分配给b,将y分配给a

我认为“同时”的概念不是逻辑真实的,内存中a的值必须首先改变,然后b,反之亦然,因此{{1}的值除非有另一个变量来保存上面的新值,否则仍依赖a或反之亦然。