Possible Duplicate:
Python ‘==’ vs ‘is’ comparing strings, ‘is’ fails sometimes, why?
Is
a == b
the same as
a is b
?
If not, what is the difference?
Edit: Why does
a = 1
a is 1
return True, but
a = 100.5
a is 100.5
return False?
Possible Duplicate:
Python ‘==’ vs ‘is’ comparing strings, ‘is’ fails sometimes, why?
Is
a == b
the same as
a is b
?
If not, what is the difference?
Edit: Why does
a = 1
a is 1
return True, but
a = 100.5
a is 100.5
return False?
No, these aren't the same. is is a check for object identity - ie, checking if a and b are exactly the same object. Example:
a = 100.5
a is 100.5 # => False
a == 100.5 # => True
a = [1,2,3]
b = [1,2,3]
a == b # => True
a is b # => False
a = b
a == b # => True
a is b # => True, because if we change a, b changes too.
So: use == if you mean the objects should represent the same thing (most common usage) and is if you mean the objects should be in identical pieces of memory (you'd know if you needed the latter).
Also, you can overload == via the __eq__ operator, but you can't overload is.
is, so it's hard to say how this is the exact opposite of it.== tests memory addressa is 1 returning true.1 will point to the same address for performance reasons. you can't rely on this, though.a = [1,2,3] and b = [1,2,3], then wouldn't a == b evaluate to true regardless of memory address?As already very clearly explained above.
is : used for identity testing (identical 'objects')
== : used for equality testing (~~ identical value)
Also keep in mind that Python uses string interning (as an optimisation) so you can get the following strange side-effects:
>>> a = "test"
>>> b = "test"
>>> a is b
True
>>> "test_string" is "test" + "_" + "string"
True
>>> a = 5; b = 6; c = 5; d = a
>>> d is a
True # --> expected
>>> b is a
False # --> expected
>>> c is a
True # --> unexpected
<= 256)>>> a = "test" >>> b = "test" >>> a is b True >>> a = "test_string" >>> c = b + "_string" >>> a == c True >>> a is c False