6

我有以下表达式:

>>> a = 3
>>> b = 2
>>> a == (a := b)
False

现在,a == 2手术后,正如预期的那样。结果就是我想要的,即a在分配之前与分配的 RHS 进行比较。

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

>>> a = 3
>>> b = 2
>>> (a := b) == a
True

在PEP-572, relative priority section中似乎没有任何与此极端情况直接相关的内容。下一节,对评估顺序的更改提到评估顺序是从左到右的。这就是这里发生的事情吗(存储 的值a,更新它,比较 vs 更新a,然后比较它的新值)?

这种行为在哪里定义,它的可靠性如何?

4

1 回答 1

7

这些 PEP 部分都与此无关。你只是有一个==比较,一般的评估顺序适用:“Python 从左到右评估表达式。”

因此,您(a := b) == a只需首先评估left side (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 ...}评估Y过的字典理解X,针对一般的从左到右规则和针对字典的显示,就像之前已经按预期{X: Y}评估过的一样。考虑一下:XY

>>> a, b = 3, 2
>>> {a: (a := b) for _ in '_'}
{3: 2}

使用这种旧行为,它会导致{2: 2}. 鉴于人们可能会在:=可用时写出类似的东西,这变得更加成问题。

于 2021-09-14T02:41:57.273 回答