Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中元组匹配与变量赋值_Python - Fatal编程技术网

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