首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >赋值表达式的求值顺序(walrus算子)

赋值表达式的求值顺序(walrus算子)
EN

Stack Overflow用户
提问于 2021-09-13 18:55:12
回答 1查看 390关注 0票数 7

我有以下表达:

代码语言:javascript
复制
>>> a = 3
>>> b = 2
>>> a == (a := b)
False

现在,a == 2操作完成后,如预期的那样。结果是我想要的,也就是比较a和分配前的RHS。

倒转相等运算符的顺序将反转结果:

代码语言:javascript
复制
>>> a = 3
>>> b = 2
>>> (a := b) == a
True

PEP-572,相对优先段中,似乎没有任何与这个角落的情况直接相关的东西。在下一节中,更改评估顺序提到了计算顺序从左到右.这里到底发生了什么(保存a的值,更新它,比较vs更新a,然后比较它的新值)?

这个行为是在哪里定义的,它有多可靠?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 02:41:57

这些PEP部分都与此无关。您只需进行==比较,一般的评价顺序应用:“评价顺序从左到右计算表达式。”

因此,您的(a := b) == a只需首先计算左边的(a := b),将一些东西分配给a,然后计算到相同的值。然后计算右边的a,它当然仍然是相同的(刚刚赋值)值,所以您得到了True

关于PEP部分:

第一个PEP部分说的是,:=组比==更少,所以如果没有括号,它就适用了

  • a == a := b意味着(a == a) := b (尝试分配给比较时会出现语法错误)。
  • a := b == a的意思是a := (b == a),其中b == a值计算为False,然后分配给a,并成为整个表达式的结果。(注意,在语句级,您必须编写(a := b == a)。)

第二个PEP部分所做的仅仅是指出一些已经存在但:=使其“更明显”的坏东西,所以他们建议最终修复它。问题是,像{X: Y for ...}这样的dict理解在X之前评估了X,违背了一般的左到右规则,也违背了dict的显示,比如{X: Y},后者已经按照预期在Y之前对X进行了评估。考虑到这一点:

代码语言:javascript
复制
>>> a, b = 3, 2
>>> {a: (a := b) for _ in '_'}
{3: 2}

如果有了这种旧的行为,它就会导致{2: 2}。考虑到当:=可用时,人们可能会写类似的东西,这就成了一个更大的问题。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69167795

复制
相关文章

相似问题

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