سیف خان سیف خان - 7 months ago 5
Python Question

Why does string equality not working in this Python code as expected?

Note: Before you go and downvote or close my question, or mark it a duplicate, let me assure you that I have looked a dozens and dozens of similar questions on SO and Googled but after more than an hour, I still haven't solved this problem. No other answer solved my problem.

Question
I have this Python code:

text = ''
text += '<' + '/' + '>'

print text, '</>'
print repr(text), repr('</>')

if text is '</>':
print 'Equal'
else:
print 'Not equal!'


I simply want to compare two strings. For some reason, I need to concatenate characters to
text
one by one. I expected the if-statement to evaluate to
True
but it doesn't. And I am at a loss why!

Here's the output:

</> </>
'</>' '</>'
Not equal!


I am new to Python, and am using Python 2.7. Can anybody help, please?

Answer

You need to use == not is. is checks for object identity not equality.

e.g.

Let's say you have foo and bar such that:

>>> foo = 'green eggs and ham'
>>> bar = 'green eggs and ham'
>>> foo is bar
>>> False
>>> foo == bar
>>> True

On my machine:

>>> id(foo)
>>> 52008832 
>>> id(bar)
>>> 52010560

Now, check this out:

>>> foobar = bar
>>> foobar is bar
>>> True

More interestingly, consider two ints. This will only work for small ints.

>>> foo = 123
>>> bar = 123
>>> foo is bar
>>> True
>>> id(foo)
>>> 1993000432 # == id(bar)

Wait, what? Why does this work? It's because ints are cached.

Comments