最近,我回答了a question用户因为在另一个数组中添加多维数组而出现问题的地方,在我的回答中我注意到,可以使用可迭代解压缩来填充x和y值,并在同一行上将其赋值给board[x][y]。
我原以为这会抛出一个错误,因为当时还没有定义x和y,因为即使在iterable-unpacking标记中,它也是这样读的:
可迭代元素的simultaneously分配给多个值。
在下面的示例中,这可以看作是有效的:
>>> 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那么,为什么在第一个例子中这是有效的呢?
发布于 2017-12-16 04:09:17
=的右侧总是首先计算,在这种情况下,它是打包成元组的。然后,当解释左手边时,该元组将被解压。左右两面不共享变量知识。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 definedhttps://stackoverflow.com/questions/47842352
复制相似问题