我是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
由于
答案 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 + b
为1, 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