开发者

Python evaluation order [duplicate]

开发者 https://www.devze.com 2022-12-22 21:15 出处:网络
This question already has an answer here: 开发者_如何学C Python's in (__contains__) operator returns a bool whose value is neither True nor False
This question already has an answer here: 开发者_如何学C Python's in (__contains__) operator returns a bool whose value is neither True nor False (1 answer) Closed 8 years ago.

Here's the code, I don't quite understand, how does it work. Could anyone tell, is that an expected behavior?

$ipython

In [1]: 1 in [1] == True
Out[1]: False

In [2]: (1 in [1]) == True
Out[2]: True

In [3]: 1 in ([1] == True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/dmedvinsky/projects/condo/condo/<ipython console> in <module>()

TypeError: argument of type 'bool' is not iterable

In [4]: from sys import version_info

In [5]: version_info
Out[5]: (2, 6, 4, 'final', 0)


This is an example of "chaining" which is a gotcha in Python. It's a (possibly silly) trick of Python that:

a op b op c

is equivalent to:

(a op b) and (b op c)

for all operators of the same precedence. Unfortunately, in and == have the same precedence, as do is and all comparisons.

So, here is your unexpected case:

1 in [1] == True  # -> (1 in [1]) and ([1] == True) -> True and False -> False

See See http://docs.python.org/reference/expressions.html#summary for the precedence table.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号