【发布时间】:2015-04-29 13:18:30
【问题描述】:
比较可以任意链接,例如,
x < y <= z等价于x < y and y <= z,除了y只被评估一次(但在这两种情况下,z根本不被评估,当x < y被发现是假的)。
这些 SO 问题/答案进一步阐明了这种用法:
- Python comparison operators chaining/grouping left to right?
- What does "evaluated only once" mean for chained comparisons in Python?,尤其是the currently-accepted answer
类似(人为的例子):
if 1 < input("Value:") < 10: print "Is greater than 1 and less than 10"
只要求输入一次。这是有道理的。还有这个:
if 1 < input("Val1:") < 10 < input("Val2:") < 20: print "woo!"
只要求Val2 如果 Val1 介于 1 和 10 之间,并且只打印“woo!” 如果 Val2 也在 10 到 20 之间(证明它们可以“任意链接”)。这也是有道理的。
但我仍然很好奇这是如何在词法分析器/解析器/编译器(或其他)级别实际实现/解释的。
上面的第一个例子基本上是这样实现的吗:
x = input("Value:")
1 < x and x < 10: print "Is between 1 and 10"
x 真的只存在于那些比较中(实际上基本上是未命名的)?或者它是否以某种方式使比较运算符返回布尔结果和正确操作数的评估(用于进一步比较)或类似的东西?
将分析扩展到第二个示例让我相信它使用了类似未命名的中间结果(如果有这个术语,请告诉我),因为它不会在进行比较之前评估所有操作数。
【问题讨论】:
标签: python comparison-operators python-internals