Python WTF: Entendiendo cómo funciona is

He estado echando un ojo a un post de Reddit, donde algunos comportamientos del lenguaje parecen que no son los adecuados (bug), pero que se deben en su mayoría a pequeños fallos de comprensión de la sintaxis tan propia de python.

El que os traigo aquí es el siguiente:

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

Aparentemente vemos que hay una inconsistencia en el funcionamiento. Lo esperado es que si comparas si 256 is 256 es que te de que sí. Hasta aquí bien. El problema lo tenemos con el siguiente número: 257, donde no funciona igual.

Esto se debe a dos causas. La primera de las dos es la implementación interna de CPython, la distribución python por excelencia. Aquí, todos los enteros desde -5 hasta 256 (ambos incluidos), tienen una única instancia, por ser los enteros que más se utilizan. Sin embargo, los enteros que son mayores de 257 o menores que -5 tienen otra dirección en memoria a medida que se crean.

La segunda causa es cómo funciona realmente is. Lo que hace es comparar referencias a bajo nivel en memoria, por lo que, como hemos visto antes, los números contenidos en el intervalo [-5, 256] tendrán la misma dirección en memoria y darán True en la comparación.

Como dato curioso, si intentamos lo mismo en pypy, una implementación de Python optimizada para cálculos numéricos, nos funcionará para todos los enteros.

Para concluir, lo mejor que podemos utilizar para comparar en python es el operador ==, que éste sí que tiene el comportamiento esperado en todos los casos. Si queremos ir más en modo hardcore utilizando las referencias a memoria con cuidado, entonces utilizaremos is.

Fuente | Reddit

2 0

2 opiniones en “Python WTF: Entendiendo cómo funciona is”

Deja un comentario