Python变量赋值问题

3zz*_*zzy 4 python fibonacci variable-assignment

a,b = 0,1 
while b < 50:
    print(b)
    a = b
    b = a+b
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
4
8
16
32
Run Code Online (Sandbox Code Playgroud)

wheras:

a,b = 0,1 
while b < 50:
    print(b)
    a,b = b, a+b
Run Code Online (Sandbox Code Playgroud)

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

1
1
2
3
5
8
13
21
34
Run Code Online (Sandbox Code Playgroud)

他们不一样吗?我的意思a,b = b, a+b是基本上a = bb = a+b单独写的一样- 不是吗?

ype*_*eᵀᴹ 11

不,他们不一样.

写作时a,b = b, a+b,分配是"同时"完成的.a,b = b, a+b和...一样(a, b) = (b, a+b).所以,之后

a, b = 5, 8
Run Code Online (Sandbox Code Playgroud)

a = 5,b = 8.当Python看到这个

(a, b) = (b, a+b)
Run Code Online (Sandbox Code Playgroud)

首先计算右侧 (b, a+b)(8,13) ,然后分配(该元组)向左侧,向(a,b).


当你有: a = b然后b = a+b,这两个操作一个接一个地完成.但对于他们每个人:

a = b
Run Code Online (Sandbox Code Playgroud)

首先计算右侧 b ,然后分配(此值)至左侧,以a.然后再次

b = a + b
Run Code Online (Sandbox Code Playgroud)

首先计算右侧 a + b ,然后分配(此值)至左侧,以b.

  • 不仅"同时"在技术上是错误的,它也会混淆问题.关键是_all_右边的表达式在进行任何赋值之前进行评估.所以在'a = a + b`和'a,b = b,a + b`之间确实没有区别 - 在这两种情况下,右边的值是使用"a"和"a"的"旧"值计算的. B`. (2认同)

Mic*_*ski 5

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

在第二个例子中,a被分配了当前值,b并被b赋予当前值a加上当前值b.它发生在a变化的价值之前.

这两个任务同时发生而不是顺序发生.


Rom*_*huk 5

这些陈述是不同的.

a = b
b = a+b
Run Code Online (Sandbox Code Playgroud)

修改a,然后使用修改后的值进行更改b.实际上,它总是如此b = b + b.

a,b = b, a+b
Run Code Online (Sandbox Code Playgroud)

变化ba在同一时刻,因此b使用原始a值计算.