首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可拆包评定顺序

可拆包评定顺序
EN

Stack Overflow用户
提问于 2017-12-16 03:49:33
回答 1查看 136关注 0票数 1

最近,我回答了a question用户因为在另一个数组中添加多维数组而出现问题的地方,在我的回答中我注意到,可以使用可迭代解压缩来填充xy值,并在同一行上将其赋值给board[x][y]

我原以为这会抛出一个错误,因为当时还没有定义xy,因为即使在iterable-unpacking标记中,它也是这样读的:

可迭代元素的simultaneously分配给多个值。

在下面的示例中,这可以看作是有效的:

代码语言:javascript
复制
>>> board = [[0, 0], [0, 0]]
>>> move = [0, 1, 2]
>>> x, y, board[x][y] = move
>>> board
[[0, 2], [0, 0]]

这与以下相同:

代码语言:javascript
复制
>>> 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]]

然而,当使用以下方法计算斐波纳契序列时:

代码语言:javascript
复制
a, b = b, a + b

它不评价如下:

代码语言:javascript
复制
a = b
b = a + b

以及当交换值时:

代码语言:javascript
复制
a, b = b, a

它不评价如下:

代码语言:javascript
复制
a = b
b = a

那么,为什么在第一个例子中这是有效的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-16 04:09:17

=的右侧总是首先计算,在这种情况下,它是打包成元组的。然后,当解释左手边时,该元组将被解压。左右两面不共享变量知识。RHS成为一个值,然后LHS使用该值将变量(标签)赋值。

在您的示例中,xy的值是在评估RHS之后确定的。然后从左到右展开包装,这样board[x][y]就有了有效的索引。

切换订单演示了解封顺序:

代码语言:javascript
复制
>>> 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47842352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档