Operadores de identidad

Existe un tipo especial de operador en Python llamado operador de identidad. Básicamente un operador de identidad es una palabra reservada que evalúa si dos variables distintas contienen el mismo objeto. Dicho de otra manera y en términos de variables tipo punteros, los operadores de identidad devuelven el valor booleano TRUE si los identificadores de dos variables distintas apuntan a la misma dirección de memoria.

Veamos con un ejemplo práctico desde la consola de Python:

>>> a=1500

>>> b=1500

>>> a==b

True

>>> a is b

False

Nota: Es importante destacar que el intérprete de Python en la cónsola puede devolver True en una comparación de valores de identidad de 2 variables diferentes si los valores de éstas son iguales o menores a 256. Veamos el siguiente ejemplo:

>>> b=256

>>> a= 256

>>> a==b

True

>>> a is b

True

Lo anterior aparentemente contradice al planteamiento del concepto mismo del operador de pertenencia. Sin embargo esto sucede debido al mecanismo de optimización del intérprete CPython, en donde se crean previamente los valores enteros desde -5 hasta 256 debido a su uso frecuente en programación. Haciendo que todas las variables que compartan algún valor entero dentro del rango -5 a 256 en realidad apunten al mismo sector de la memoria con el fin de agilizar el funcionamiento de los programas hechos en Python. Se puede ver en el siguiente ejemplo por cónsola como esta aparente contradicción desaparece al asignarle valores iguales y superiores a 256 a diferentes variables:

>>> a= 257

>>> b=257

>>> a==b

True

>>> a is b

False

En todo caso y a pesar de esta característica de optimización, siempre se debe considerar el uso del operador de identidad IS solamente para comprobar si dos variables diferentes apuntan al mismo sector de memoria, es decir, que sean en esencia la misma variable. No que contengan el mismo valor a pesar que pudiera funcionar en casos de valores enteros dentro del rango mencionado anteriormente (-5,256). Esto se considera una mala práctica y debe evitarse en todo caso.

Dicho esto y solo como mera curiosidad es interesante considerar que este resultado varía dependiendo si se ejecuta desde el intérprete de la cónsola en modo interactivo o si se ejecuta un script. Esta discrepancia se debe a que en modo interactivo el intérprete de Python no sabe lo que el usuario va a hacer a continuación con las variables con lo cual no aplica el mismo rango de optimización que como lo haría interpretando un código fuente entero, donde hace un parseo del programa entero y luedo de la detección de errores de sintaxis, aplica todas las optimizaciones pertinentes, aplicando la misma optimización que en el caso del modo interactivo pero a todas las variables del programa.

Veamos el mismo ejemplo usando la extensión de Python para el editor de código fuente independiente de Microsoft Visual Studio Code:

a=256
b=256

print("OPERADORES DE IDENTIDAD\n")
print(f"¿Es {a} = {b}? Respuesta: {a == b}")
print(f"¿{a} es {b}? (Es decir ¿{a} apunta al mismo lugar dentro de la memoria "\
    f"que {b}? Respuesta: {a is b}") #Por consola arroja FALSE


el código arroja el siguiente

OPERADORES DE IDENTIDAD


¿Es 256 = 256? Respuesta: True

¿256 es 256? (Es decir ¿256 apunta al mismo lugar dentro de la memoria que 256? Respuesta: True


Como era de esperarse la respuesta es True, sin embargo si cambiamos el valor asignado a las variables a y b a 257 respectivamente seguiremos obteniendo el valor True po las razones expuestas previamente. Veamoslo en la práctica:


a=257
b=257

print("OPERADORES DE IDENTIDAD\n")
print(f"¿Es {a} = {b}? Respuesta: {a == b}")
print(f"¿{a} es {b}? (Es decir ¿{a} apunta al mismo lugar dentro de la memoria "\
    f"que {b}? Respuesta: {a is b}") #Por consola arroja FALSE

El resultado es:


OPERADORES DE IDENTIDAD


¿Es 257 = 257? Respuesta: True

¿257 es 257? (Es decir ¿257 apunta al mismo lugar dentro de la memoria que 257? Respuesta: True

Comprobando de esta manera lo expuesto anteriormente.

Fuentes: 

https://www.analyticslane.com/2020/09/28/diferencia-entre-los-operadores-is-y-en-python/

https://es.stackoverflow.com/questions/306662/por-qu%C3%A9-el-operador-is-no-funciona-para-comparar-valores

https://es.stackoverflow.com/questions/540673/por-qu%c3%a9-en-python-el-operador-de-identidad-is-devuelve-true-al-evaluar-2-variab/540675#540675


Comentarios

Entradas populares