I actually needed xor for my solution, but while thinking on it, I started wondering about the question above. What is the meaning of True == True != False?
Looking at the documentation I suppose it's True == True and True != False, but I'd like a more general and certain approach. How do I quickly get readable form of bytecode for such code. Is there an easier way to find out than both bytecode and documentation?
It's called operator chaining. Whenever you have an expression like A op1 B op2 C with op1 and op2 comparisons it is "translated" to A op1 B and B op2 C.
(Actually it does evaluate B only once).
Note: comparisons operator include in, not in, is, is not! (e.g. a is b is not None means a is b and b is not None).
If you want to look at bytecode you can use the dis module:
In [1]: import dis
In [2]: dis.dis(lambda: True == True != False)
1 0 LOAD_CONST 1 (True)
3 LOAD_CONST 1 (True)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 2 (==)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 2 (False)
17 COMPARE_OP 3 (!=)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
If you read at the bytecode you can understand that it performs operator chaining.
Given that the expression is True == True != False, which is "interpreted" as True == True and True != False it first loads the two True constants for the first operator via the LOAD_CONST bytecode. The DUP_TOP duplicates the top of the stack(this avoids re-evaluating True for the second comparison).
It performs the first comparison(COMPARE_OP) if it is false it just to the bytecode 21, otherwise it pops the top of the stack(JUMP_IF_FALSE_OR_POP). It then performs the second comparison.
To answer your general question the fastest way to find out about some feature of python is to use the quicksearch page of the documentation. I'd also suggest to read Python's tutorial for a general introduction to the language.
I'd like to add that, since python provides an interactive environment, it is often easier to understand how some code works writing it in the interpreter and watching the results. Almost all buil-in types have the documentation available via docstrings, so doing help(some_object) should give you a lot of information.
In particular IPython provides an enhanced interactive interpreter with more user-friendly help messages/error formatting etc.)
In most languages, a == b != c parses as (a == b) != c.
Therefore, what you would expect is that True == True != False would be the same as (True == True) != False, which evaluates to True != False, which evaluates to True.
Python has a different meaning, as can be witnessed here:
>>> True != False != False
False
>>> (True != False) != False
True
In Python, a == b != c is equivalent to (a == b) and (b != c).
This means that True == True != False is equivalent to (True == True) and (True != False), which evaluates to True and True, which evaluates to True.
Coincidentally, both meanings (Python's and that of other languages) give the same result here, but one should be cautious.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With