4 ms·
It seems to be a case of leaky abstraction, where the way python caches small objects becomes visible, another example: >>> a = 'hn' >>> a is 'hn' True
by fela 11y ago
It seems to be a case of leaky abstraction, where the way python caches small objects becomes visible, another example:
>>> a = 'hn'
>>> a is 'hn'
True
>>> a = ''.join(['h', 'n'])
>>> a is 'hn'
False
>>> a
'hn'
>>> a = 'h' + 'n'
>>> a is 'hn'
True
Edit: found another interesting case
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a = 500
>>> b = 500
>>> a is b
False
- odonnellryan 11y agoSecond case is because of the range of integers that are cached, right?
- Veedrac 11y agoIt's actually more complicated than that. CPython will cache constants within a scope, so a = 500 b = 500 a is b will give `True`. But the REPL forces each line to compile separately and CPython won't cache across them. However, there's a global cache for integers less than 256 so in that case they're `is`-equivalent even in the REPL.