title: "is" operator behaves unexpectedly with integers
body: <p>Why does the following behave unexpectedly in Python?</p>
  
  <pre><code>&gt;&gt;&gt; a = 256
  &gt;&gt;&gt; b = 256
  &gt;&gt;&gt; a is b
  True           # This is an expected result
  &gt;&gt;&gt; a = 257
  &gt;&gt;&gt; b = 257
  &gt;&gt;&gt; a is b
  False          # What happened here? Why is this False?
  &gt;&gt;&gt; 257 is 257
  True           # Yet the literal numbers compare properly
  </code></pre>
  
  <p>I am using Python 2.5.2. Trying some different versions of Python, it appears that Python 2.3.3 shows the above behaviour between 99 and 100.</p>
  
  <p>Based on the above, I can hypothesize that Python is internally implemented such that "small" integers are stored in a different way than larger integers and the <code>is</code> operator can tell the difference. Why the leaky abstraction? What is a better way of comparing two arbitrary objects to see whether they are the same when I don't know in advance whether they are numbers or not?</p>