可重复拆包评估订单

时间:2017-12-16 03:49:34

标签: python variable-assignment iterable-unpacking

我最近回答了a question用户遇到问题,因为他们将多维数组附加到另​​一个数组,在我的回答中引起了我的注意,可以使用iterable unpacking来填充xy值,并在同一行分配给board[x][y]

我曾预料到这会导致xy在未定义时出现错误,即使在iterable-unpacking标记中也是如此:

  

可迭代的元素同时分配给多个值

这可以看作是在以下示例中工作:

>>> board = [[0, 0], [0, 0]]
>>> move = [0, 1, 2]
>>> x, y, board[x][y] = move
>>> board
[[0, 2], [0, 0]]

与以下内容相同:

>>> board = [[0, 0], [0, 0]]
>>> move = [0, 1, 2]
>>> x = move[0]
>>> y = move[1]
>>> board[x][y] = move[2]
>>> board
[[0, 2], [0, 0]]

但是在使用以下方法计算斐波纳契数列时

a, b = b, a + b

它没有评估为:

a = b
b = a + b

使用以下内容交换值时

a, b = b, a

它没有评估为:

a = b
b = a

那为什么这在第一个例子中起作用?

1 个答案:

答案 0 :(得分:2)

始终首先评估=的右侧,在这种情况下,它正在打包一个元组。然后在解释左侧时解压缩该元组。左侧和右侧不共享变量知识。 RHS成为一个值,然后LHS使用分配给变量(标签)。

在您的示例中,xy的值是在评估RHS后确定的。然后解包从左到右发生,因此board[x][y]具有有效索引。

切换顺序演示了解包序列:

>>> board[x][y], x, y = move[2], move[0], move[1]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-a984ef3168f8> in <module>()
----> 1 board[x][y], x, y = move[2], move[0], move[1]    
NameError: name 'x' is not defined