Python解析器中的复杂性

时间:2011-01-07 02:10:14

标签: python

表达式"word" in [] == False的内容以什么顺序解析?它似乎无视所有逻辑:

>>> "word" in [] == False
False
>>> ("word" in []) == False
True
>>> "word" in ([] == False)
TypeError

Python如何实际解释这个表达式,为什么会这样解释呢?

编辑:

最常见的情况似乎是

>>> any_value in any_list == any_symbol_or_value
False

2 个答案:

答案 0 :(得分:10)

通常,您可以使用this table.找出运算符优先级。

但这实际上是一个棘手的例子:

  

比较可以链接   任意地,例如,x < y&lt; = z是   相当于x&lt; y和y&lt; = z,除了   y只评估一次(但在   两个案例z都没有被评估   当x < y被发现是假的。)

See the notes on comparisons.

所以"word" in [] == False真的是

("word" in []) and ([] == False)

其中两个[]实际上是同一个对象。

这对其他比较很有用,即0 < a < 10,但这里确实令人困惑!

答案 1 :(得分:1)

由于隐式word in []

and正在使第一个表达式短路。当它意识到它是假的时,它会停止评估表达式的其余部分,这是[]word刚刚测试的同一实体)与值False之间的比较。 []不等于False,因此隐含的“和”表达式为false。

("word" in []) == False按预期工作,因为( )完成子条款并将其结果False进行比较。

当然,[]再次不等于False


为澄清第一种情况,您可以像这样测试:

foo = []

if ("word" in foo) and (foo == False):
    print "True"
else:
    print "False"

从功能上讲,这是正在发生的事情。