Python Iterable开箱评估订单

Python Iterable开箱评估订单,python,variable-assignment,iterable-unpacking,Python,Variable Assignment,Iterable Unpacking,我最近回答了一个用户遇到问题的地方,因为他们将多维数组附加到另一个数组中,我在回答中注意到,可以使用iterable unpacking来填充x和y值,并在同一行上分配给board[x][y] 我原以为这会引发一个错误,因为x和y当时还没有定义,因为即使在iterable unpacking标记中,它也会显示: iterable的元素同时被分配给多个值 在以下示例中可以看出这是有效的: >>> board = [[0, 0], [0, 0]] >>> move

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

我原以为这会引发一个错误,因为
x
y
当时还没有定义,因为即使在
iterable unpacking
标记中,它也会显示:

iterable的元素同时被分配给多个值

在以下示例中可以看出这是有效的:

>>> 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
它的评估结果不是:

a = b
b = a + b
a = b
b = a

那么为什么在第一个示例中可以这样做呢?

始终首先计算
=
的右侧,在本例中,它是打包一个元组。然后,在解释左侧时,该元组被解包。左右两侧不共享变量知识。RHS变成一个值,然后LHS使用该值分配给变量(标签)

在您的示例中,
x
y
的值是在评估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
板[x][y],x,y=移动[2],移动[0],移动[1] --------------------------------------------------------------------------- NameError回溯(最近一次呼叫上次) 在() ---->1板[x][y],x,y=移动[2],移动[0],移动[1] 名称错误:未定义名称“x”
这些例子似乎并不相同。我的意思是,在第一个示例中,您有
=
。第二个示例试图在
=
的两侧包含相同的变量。我认为在标题中使用“Asynchronous”有点偏离了问题的主题,可能会导致人们在错误的方向上搜索python
Asynchronous
。也许更像是“Iterable Unpackage evaluation order”?@Aaron谢谢,我想不出更好的术语了,所以我只是在Google上搜索了Synchronous的反面,我现在就更改它,虽然我发现它不太可能更改,这是在任何地方声明的预期行为,还是仅仅是一个实现细节?我可以看到未来可能出现的情况,自动化并行化可能会打破这一局面(同样,不太可能,但可能)。“虽然赋值的定义意味着左手边和右手边之间的重叠是‘同时的’(例如a,b=b,a交换两个变量),但赋值变量集合内的重叠从左到右发生,有时会导致混淆。例如,以下程序打印[0,2]:x=[0,1]i=0 i,x[i]=1,2#i被更新,然后x[i]被更新打印(x)