我有以下表达式:
>>> a = 3
>>> b = 2
>>> a == (a := b)
False
现在,在这个操作之后,a == 2
,与预期相符。结果正是我想要的,即将a
与赋值右侧比较后再进行赋值。
反转等号操作符的顺序会反转结果:
>>> a = 3
>>> b = 2
>>> (a := b) == a
True
在PEP-572的相对优先级部分中,似乎没有直接涉及到这个角落案例的相关内容。下一部分改变评估顺序提到评估顺序是从左到右。这里是否也是这样做的(隐藏a
的值,更新它并与更新a
的值进行比较,然后与其新值进行比较)?
这种行为在哪里定义,可靠性如何?
:=
操作符,对于a == f(b)
和f(b) == a
也会产生相同的行为,其中f
是改变全局变量a
的函数(或者在具有++/--
的语言中针对a == ++a
和++a == a
)。 - tobias_ka == ++a
和++a == a
的东西通常不是有序的;语言可以选择以任何顺序评估它们(我认为最新的C++标准做了一些事情使得这样的东西有序化,但这是一个非常近期的变化);a == ++a
可以先评估左边或右边,整个表达式将根据编译器决定首先执行哪个而评估为true或false。例如,请参见IsC == C++
undefined behaviour?。Python在左到右规则方面比大多数语言更严格。 - ShadowRanger