Python分配顺序

YTK*_*mba 2 python

我是python的新手.有人可以解释为什么以下两个python示例不输出相同的东西?

例1

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

例2

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

谢谢

Dav*_*nan 12

在第一个版本中,当你写

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

表达方式

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

首先评估.在评估之后,随后将其分配给a, b元组解包.关键点在于,在执行左侧名称的绑定之前,会完全评估赋值语句的整个右侧.

在第二个版本中,

a = b 
# a is now re-bound and potentially has changed value
Run Code Online (Sandbox Code Playgroud)

首先执行,然后执行

b = a + b
# the expression a + b uses the modified value of a
Run Code Online (Sandbox Code Playgroud)

之后发生.到那时,a已被重新约束.


所以,用一些值来说明.第一次循环,a, b = 0, 1我们之后

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

现在,b, a + b1, 1.所以我们有

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

但替代方案是这样的:

a = b 
# same as a = 1
b = a + b
# same as b = 1 + 1
Run Code Online (Sandbox Code Playgroud)

你在评论中提问:

如何将示例1重写为2个语句?

最安全的方法是引入临时变量.像这样:

a1 = b
b1 = a + b
# now we can assign to a and b
a = a1
b = b1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您实际上不需要两个临时变量,一个就足够了,但这是最常见的形式.


这个元组解压缩是你在Python中以惯用方式交换两个值的方法.在其他语言中,您写道:

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

在Python中你写道:

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

  • @YTKColumba:temp = b; b = a + b; a = temp; (2认同)