Python Iterable开箱评估订单
我最近回答了一个用户遇到问题的地方,因为他们将多维数组附加到另一个数组中,我在回答中注意到,可以使用iterable unpacking来填充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
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”有点偏离了问题的主题,可能会导致人们在错误的方向上搜索pythonAsynchronous
。也许更像是“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)