Hi, On 5 November 2017 at 04:06, Cameron Simpson <c...@cskk.id.au> wrote: > On 04Nov2017 01:47, Chris Angelico <ros...@gmail.com> wrote: >> >> On Fri, Nov 3, 2017 at 8:24 PM, Ali Rıza KELEŞ <ali.r.ke...@gmail.com> >> wrote: >>> >>> Yesterday, while working with redis, i encountered a strange case. >>> >>> I want to ask why is the following `True` >>> >>> ``` >>> "s" is b"s".decode() >>> ``` >>> >>> while the followings are `False`? >>> >>> ``` >>> "so" is b"so".decode() >>> "som" is b"som".decode() >>> "some" is b"some".decode() >>> ``` >>> >>> Or vice versa? >>> >>> I read that `is` compares same objects, not values. So my question is >>> why "s" and b"s".decode() are same objects, while the others aren't? >>> >>> My python version is 3.6.3.
> For speed and memory reasons, Python notices small values of strings and > ints, and allocates them only once. So When your write: > > a = "s" > b = "s" > > Python will reuse the same str object for both. Because of this, not only is > "a == b" (i.e. they have the same value) but also "a is b" (a and b refer to > the same object). But this is not guarrenteed, and certainly for larger > values Python doesn't bother. Eg: Actually I guessed that it should be a caching mechanism or something like, but i was not sure since I do not know python internals in detail. >> You shouldn't be comparing string objects with 'is'. Sometimes two >> equal strings will be identical, and sometimes they won't. All you're >> seeing is that the interpreter happened to notice and/or cache this >> particular lookup. > > > To be more clear here, usually when humans say "identical" they mean having > exactly the same value or attributes. > Here, Chris means that the two strings are actually the same object rather > than two equivalent objects. "is" tests the former (the same object). "==" > is for testing the latter (the objects have the same value). Initially the 'is' compared returned value with None, I changed the code and it remained as is. After i have noticed this issue. Using `is` to compare with None is OK, isn't it? Cameron, Terry, Chris thanks for your replies in depth. - Ali Riza >> >> > > > a = "ghghghghghg" > b = "ghghghghghg" > > Here they will have the same value but be different objects. So "==" will > still return True, but "is" would return False. > > You should usually be using "==" to compare things. "is" has its place, but > it is usually not what you're after. > > In your example code, b"s".decode() returns the string value "s", and Python > is internally deciding to reuse the existing "s" from the left half of your > comparison. It can do this because strings are immutable. (For example, "+=" > on a string makes a new string). > > Hoping this is now more clear, > Cameron Simpson <c...@cskk.id.au> (formerly c...@zip.com.au) > -- > https://mail.python.org/mailman/listinfo/python-list -- -- Ali Rıza Keleş -- https://mail.python.org/mailman/listinfo/python-list