New Reply

Python 3 question

 
Share Thread Thread Tools
Jul31-12, 04:11 PM   #1
 

Python 3 question


print(1!=0==0) seems to print the value 'True'. I'm trying to understand why.

Does it first evaluate (1!=0) ?

Or does it first evaluate (0==0) ?

Or does it separate them into (1!=0)^(0==0) ?

I appreciate all help.

BiP
 
PhysOrg.com
PhysOrg
science news on PhysOrg.com

>> 'Whodunnit' of Irish potato famine solved
>> The mammoth's lament: Study shows how cosmic impact sparked devastating climate change
>> Curiosity Mars rover drills second rock target
Jul31-12, 04:36 PM   #2
 
Not sure but I think it would use the left to right rule since != and == would have the same precedence as operators.

It's best to write code without an ambiguity like this by explicitly using parenthesis to order the sequence of operations.
 
Jul31-12, 04:39 PM   #3
D H
 
Mentor
Quote by Bipolarity View Post
Or does it separate them into (1!=0)^(0==0)
That's what it does. There's some python comparison chaining magic going on here to enable expressions such as 0<x<1 to mean x is between 0 and 1 -- just like one would write in math. That you can use it for 1!=0==0 is a side effect of this magic.
 
Aug1-12, 10:54 AM   #4
 
Recognitions:
Science Advisor Science Advisor

Python 3 question


Or does it separate them into (1!=0)^(0==0) ?
Quote by D H View Post
That's what it does. There's some python comparison chaining magic going on here to enable expressions such as 0<x<1 to mean x is between 0 and 1 -- just like one would write in math. That you can use it for 1!=0==0 is a side effect of this magic.
Thanks for the tip on the 0<x<1 syntax DH. That's useful to know. :)

Though surely it's equivalent to (1!=0) and (0==0), rather than xor.
 
Aug1-12, 11:21 AM   #5
D H
 
Mentor
Quote by uart View Post
Though surely it's equivalent to (1!=0) and (0==0), rather than xor.
Correct. I read the ^ as the mathematical shorthand for boolean and, which is not the case.


It's not quite equivalent to (1!=0) and (0==0). There is a subtle difference. Consider
self.inbounds = 0 < self.some_function() < 1
This will call self.some_function() once and only once. Now let's rewrite this expression as
self.inbounds = (0 < self.some_function()) and (self.some_function() < 1)
With this rewrite, self.some_function() will be called once if the result from the first call is non-positive, twice if it is positive. Calling the function sometimes once, sometimes twice, can be deleterious if the function has side effects.
 
New Reply
Thread Tools


Similar Threads for: Python 3 question
Thread Forum Replies
Compile Python, Matlab and Python Programming & Comp Sci 3
Python question Engineering, Comp Sci, & Technology Homework 1
Beginner Python question Engineering, Comp Sci, & Technology Homework 7
Beginner Python question Engineering, Comp Sci, & Technology Homework 10
Python question Engineering, Comp Sci, & Technology Homework 2