“est” l'opérateur se comporte de manière inattendue avec des entiers

Pourquoi la suite de se comporter de façon inattendue en Python?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
>>> 257 is 257
True           # Yet the literal numbers compare properly

Je suis à l'aide de Python 2.5.2. Essayer quelques-uns des différentes versions de Python, il semble que Python 2.3.3 ci-dessus montre les comportements entre 99 et 100.

Basé sur la ci-dessus, je peux émettre l'hypothèse que Python est en interne mis en œuvre, tels que les "petits" nombres entiers sont stockés d'une manière différente que les grands nombres entiers et la is opérateur peut faire la différence. Pourquoi la fuite de l'abstraction? Quelle est la meilleure façon de comparer deux objets arbitraires pour voir si elles sont la même chose quand je ne sais pas à l'avance s'ils sont des nombres ou pas?

OriginalL'auteur Greg Hewgill | 2008-11-20