[Tutor] Looks like a judgment bug.

Wayne Werner wayne at waynewerner.com
Thu Apr 11 14:16:26 CEST 2013


On Thu, 11 Apr 2013, Timo wrote:

> Op 11-04-13 12:41, w qj schreef:
>> I found this under Windows Python3
>>>>> l="http://f/"
>>>>> l[-1] is not '/'
>> False
>> and this under Linux Python3
>>>>> l = "http://ff.f/"
>>>>> l[-1]
>> '/'
>>>>> l[-1] is not '/'
>> True
>> 
>> It's Looks like a python bug?
> This looks like a "is not" versus "!=" thing. Someone (I think Steven 
> Apprano) posted a couple of days ago on this mailing list to only use "is" 
> and "is not" when comparing to None.

You're absolutely correct.

`is` compares the identity (basically id('/') == id('/') )

*sometimes* CPython will use a trick that caches smaller strings, so this 
might work one time:

     >>> x = '/'
     >>> y = '/'
     >>> x is y
     True

But then the next time you do the same thing it could return False. Or on 
a different OS. There's nothing (that I'm aware of) that will guarantee 
either result in this case.

In the example case we were comparing that `l[-1]` referred to the same 
spot in memory as the literal string `/`. And as the example showed, 
sometimes it will be, other times it won't.


The takeaway is to use `is` when you want to compare identity, and `==` 
when you want equaltiy. For example,

    That car is *my* car.

The car I'm referring to is one specific car. But if I were to say...

    My car is a Chevette.

That would be more like saying `car.model == 'Chevette'` - many different 
cars may actually be a Chevette.

HTH,
Wayne


More information about the Tutor mailing list