解释单行中的多个变量赋值是如何工作的? (例如:a,b = b,a + b)

时间:2018-04-08 15:23:51

标签: python

说我有这个Python代码

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

对于n=1000,这会打印:

1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

但我不明白为什么它是1 1 2 3

问题在于这一行:

a, b = b, a+b

执行的顺序是什么? 我看到的两个选项是:

1

a = b
b = a+b

2

b = a+b
a = b

但是当我手动尝试时,它们都没有给我正确的结果。 我错过了什么?

3 个答案:

答案 0 :(得分:2)

您分享的两个选项中没有一个实际描述了以下方面的工作:

var arrayObjects = ['James', 'CEO', '$13000', 'London'];
// or
var arrayObjects = {
  "name": "James",
  "position": "CEO",
  "salary": "$13,140",
  "office": "London"
};

// it will work now
myDataTable.clear().row.add(arrayObjects).draw();

以上代码为a, b = b, a+b 分配a的值。并且b的旧值为b(即在a+ba+b的旧值)。您可以将其视为等同于:

a

示例:一行中的双变量赋值:

>>> temp_a, temp_b = a, b
>>> a = temp_b
>>> b = temp_a + temp_b

等效显式逻辑:

>>> a, b = 3, 5
>>> a, b = b, a+b
>>> a
5
>>> b
8

答案 1 :(得分:2)

a, b = b, a+b中的操作顺序是构造元组(b, a+b),然后将该元组分配给变量(a, b)。换句话说,分配的右侧在左侧之前完全被评估。

(实际上,从Python 2.6开始,在这样的情况下实际上没有构造元组,最多有3个变量 - 更有效的字节码操作系列被替换。但是,根据设计,这不是具有任何可观察性的变化的差异。)

答案 2 :(得分:0)

交换两个变量的python标准方法,这是一个清除疑点的工作示例,

  
    

Python从左到右评估表达式。请注意,虽然     评估一项任务,在评估之前对右侧进行评估     左手边。

  
     

http://docs.python.org/3/reference/expressions.html#evaluation-order

a=[1,2,3,4,5]

for i,j in enumerate(a):
    if i==1:
        a[i-1],a[i]=a[i],a[i-1]

print(a)

输出:

[1, 2, 3, 4, 5]

有关详细信息,请read this tutorial