Puzzled by "is"
Neil Cerutti
horpner at yahoo.com
Thu Aug 9 16:28:57 EDT 2007
On 2007-08-09, John K Masters <johnmasters at oxtedonline.net> wrote:
> On 15:53 Thu 09 Aug , Steve Holden wrote:
>> Dick Moores wrote:
>> > At 10:46 AM 8/9/2007, Bill Scherer wrote:
>> >> Dick Moores wrote:
>> [...]
>> >> There is only one empty tuple.
>> >> Does that clear it up for you?
>> >
>> > But isn't that the same as saying, "That's just the reality of
>> > Python; it is what it is."? I want to know why there is only one
>> > empty tuple, but more than one (1,).
>> >
>> Why? Because.
>>
>> Seriously, it's just an optimization by the implementers. There is no
>> need for more than one empty tuple, since tuples can never be modified
>> once created.
>>
>> But they decided not to create (1, ) in advance. They probably knew that
>> hardly anybody would want to create that tuple ;-) [Seriously: if you
>> started trying to predict which tuples would be used you would go
>> insane, but the empty tuple is the most likely candidate].
>>
>> > Also,
>> > >>> [] is []
>> > False
>> >
>> In that case it would definitely NOT make sense to have them the same
>> list. Python always ensures that the [] constructor creates a new list,
>> since that list may be bound to one or more variables and mutated. You
>> wouldn't want
>>
>> a = []
>> b = []
>> a.append("boo!")
>>
>> to change b so it was no longer an empty list. If you wanted a and b to
>> reference the same list you would change the second statement to
>>
>> b = a
>>
>> regards
>> Steve
>
> OK fiddling around with this and reading the docs I tried:-
> a = 'qqqqqqqqqq' #10 q's
> b = 'qqqqqqqqqq' #10 q's
CPython is full of cute little optimizations, and one of them is
that literal strings less than a certain length are 'interned'.
This makes them very fast to compare for equality, and cheaper to
store (maybe?).
> a is b
> true
> c = 'q' * 10
> c
> 'qqqqqqqqqq' #10 q's
> d = 'q' * 10
> d
> 'qqqqqqqqqq' #10 q's
> c is d
> false
>
> So from what I've read "==" tests for equivalence, "is" tests
> for identity but that does not explain the behaviour above.
The 10 q's constructed with string arithmetic were not interned,
because they were not literals.
--
Neil Cerutti
More information about the Python-list
mailing list