我有以下表达:
>>> a = 3
>>> b = 2
>>> a == (a := b)
False现在,a == 2操作完成后,如预期的那样。结果是我想要的,也就是比较a和分配前的RHS。
倒转相等运算符的顺序将反转结果:
>>> a = 3
>>> b = 2
>>> (a := b) == a
True在PEP-572,相对优先段中,似乎没有任何与这个角落的情况直接相关的东西。在下一节中,更改评估顺序提到了计算顺序从左到右.这里到底发生了什么(保存a的值,更新它,比较vs更新a,然后比较它的新值)?
这个行为是在哪里定义的,它有多可靠?
发布于 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进行了评估。考虑到这一点:
>>> a, b = 3, 2
>>> {a: (a := b) for _ in '_'}
{3: 2}如果有了这种旧的行为,它就会导致{2: 2}。考虑到当:=可用时,人们可能会写类似的东西,这就成了一个更大的问题。
https://stackoverflow.com/questions/69167795
复制相似问题