2

我是 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

谢谢

4

1 回答 1

13

在第一个版本中,当你写

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
于 2013-04-27T19:30:34.557 回答