Python分配顺序

时间:2013-04-27 19:27:59

标签: python

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

示例1

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

示例2

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

由于

1 个答案:

答案 0 :(得分:12)

在第一个版本中,当你写

a, b = b, a + b

表达式

b, a + b
首先评估

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

在第二个版本中,

a = b 
# a is now re-bound and potentially has changed value
首先执行

,然后执行

b = a + b
# the expression a + b uses the modified value of a

之后发生。到那时,a已被重新绑定。


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

# a == 0
# b == 1
a, b = b, a + b

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

a, b = 1, 1

但替代方案是这样的:

a = b 
# same as a = 1
b = a + b
# same as b = 1 + 1

你在评论中提问:

  

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

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

a1 = b
b1 = a + b
# now we can assign to a and b
a = a1
b = b1

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


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

temp = a
a = b
b = temp

在Python中你写道:

a, b = b, a