簡體   English   中英

迭代拆包評估單

[英]Iterable Unpacking Evaluation Order

我最近回答一個用戶因將多維數組附加到另​​一個數組而遇到麻煩的問題 ,在我的回答中引起了我的注意,可以使用迭代拆包來填充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

那么,為什么在第一個示例中這樣做呢?

總是首先評估=的右側,在這種情況下,它正在包裝一個元組。 然后,在解釋左側時會打開該元組的包裝。 左側和右側不共享變量知識。 RHS成為一個值,然后LHS使用該將其分配給變量(標簽)。

在您的示例中,在評估RHS之后確定xy的值。 然后解壓縮從左到右發生,因此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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM