我是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 + b是1, 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)