可迭代拆包评估顺序
Iterable Unpacking Evaluation Order
我最近回答了 用户遇到麻烦的问题,因为他们将多维数组附加到另一个数组,我在回答中注意到可以使用可迭代解包在同一行填充 x
和 y
值并分配给 board[x][y]
。
我曾预计这会引发错误,因为 x
和 y
当时尚未定义,因为即使在 iterable-unpacking
标记中它也显示为:
elements of an iterable are simultaneously assigned to multiple values
这可以被视为在以下示例中起作用:
>>> 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
那么为什么这在第一个示例中有效?
=
的右侧总是首先求值,在本例中它正在打包一个元组。然后在解释左侧时解压缩该元组。左右两侧不共享变量知识。 RHS 成为一个值,然后 LHS 使用该 value 分配给变量(标签)。
在您的示例中,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
值并分配给 board[x][y]
。
我曾预计这会引发错误,因为 x
和 y
当时尚未定义,因为即使在 iterable-unpacking
标记中它也显示为:
elements of an iterable are simultaneously assigned to multiple values
这可以被视为在以下示例中起作用:
>>> 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
那么为什么这在第一个示例中有效?
=
的右侧总是首先求值,在本例中它正在打包一个元组。然后在解释左侧时解压缩该元组。左右两侧不共享变量知识。 RHS 成为一个值,然后 LHS 使用该 value 分配给变量(标签)。
在您的示例中,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