Python中元组匹配与变量赋值
我一直认为元组匹配和变量赋值是一样的,所以我认为这两段代码做了同样的事情:Python中元组匹配与变量赋值,python,Python,我一直认为元组匹配和变量赋值是一样的,所以我认为这两段代码做了同样的事情: a = b b = a + b 及 但是,以下两段代码中的情况并非如此,它们提供了不同的输出: def fib(seq_len): a = 1 b = 1 sequence = [] for i in range(seq_len): sequence.append(a) a, b = b, a + b return sequence fib(10
a = b
b = a + b
及
但是,以下两段代码中的情况并非如此,它们提供了不同的输出:
def fib(seq_len):
a = 1
b = 1
sequence = []
for i in range(seq_len):
sequence.append(a)
a, b = b, a + b
return sequence
fib(10)
它给出了输出:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
及
这将提供以下输出:
[1, 1, 2, 4, 8, 16, 32, 64, 128, 256]
似乎在
fib
的第一个定义中,a
的前一个值被用于a,b=b,a+b
,但我不明白它是如何记住前一个值的,因为在转到b=a,b=b之前,我们已经将a
分配给了另一个值,即b
,a+b
相当于
t = b, a + b
a, b = t
不是
在执行任一赋值之前,必须对右侧进行完全求值。在进行任一赋值之前,必须对整个右侧进行求值。在第二个代码中,在计算
a+b
之前修改a
。在第a,b=b,a+b
行之前,您没有将a
重新分配给任何其他对象。在这种情况下,它仍然采用循环的上一次迭代的值。注意,很少会出现行为异常的情况。左手边是从左到右分配的,因此像a,seq[a]=…
这样的东西将使用a
的新值来索引seq
,而seq[a],a=…
将使用a
的旧值。相比之下,除了奇怪的副作用情况(从函数/方法调用、新的walrus运算符等),右侧的加载顺序并不重要,因为它只读取,在整个元组
构建完成之前,它根本不会写入左侧。@ShadowRanger True。这样的代码是我会在代码评审中开始标记的:)
[1, 1, 2, 4, 8, 16, 32, 64, 128, 256]
t = b, a + b
a, b = t
a = b
b = a + b # essentially, b = 2 * b