HOWTO · Python

Función de identidad integrada en Python

Al final de este tutorial, aprenderemos si Python tiene una función de identidad incorporada.

En esta página

Python no ofrece una función integrada cuya finalidad sea devolver su argumento sin cambios. Puedes definir ese comportamiento: una función identidad asigna cada entrada a sí misma, lo que se expresa matemáticamente como f(x) = x. Una lambda pequeña resulta útil cuando necesitas brevemente un objeto función; una función con nombre definida mediante def suele ser más clara cuando conviene nombrar o reutilizar ese comportamiento.

Funciones identidad e identidad de los objetos

Una función identidad devuelve el valor que recibe. Por ejemplo, al aplicarla a 10, produce 10; al aplicarla a una cadena, devuelve esa misma cadena. Esto se refiere a la entrada y al valor que devuelve una función. Es distinto de la identidad de los objetos, que determina si dos referencias apuntan al mismo objeto de Python.

La función integrada id() se ocupa de la identidad de los objetos: devuelve un identificador entero de un objeto durante el tiempo de vida de este. No devuelve el objeto ni implementa f(x) = x. En CPython, el identificador suele estar relacionado con una dirección, pero el código de Python debe tratarlo como un identificador opaco, no como una dirección de memoria portable. Usa la igualdad (==) para comparar valores y is cuando necesites comprobar específicamente si dos referencias apuntan al mismo objeto.

Definir una función identidad mediante una expresión anónima

Una expresión lambda crea una pequeña función anónima. Asignarla a una variable descriptiva facilita pasarla como objeto invocable:

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

identity = lambda x: x
print(identity(10))
10

El parámetro x se devuelve directamente, así que la función no transforma el valor. Esta función de un parámetro acepta un argumento; no es una forma general de reenviar varios argumentos posicionales o con nombre. Para una transformación más extensa, o si la función necesita una cadena de documentación o varias instrucciones, usa una función con nombre. Las funciones anónimas son útiles cuando se pasa una función breve a otra operación, por ejemplo como criterio de ordenación, pero una lambda no resulta automáticamente más clara solo por ser más corta.

Cuándo resulta más clara una función con nombre

Una función con nombre explicita su propósito y ofrece a quienes la llaman un nombre estable que pueden reutilizar. Por ejemplo, un programa pequeño puede definir y llamar el mismo comportamiento identidad de esta manera:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

def identity(value):
    """Return the supplied value unchanged."""
    return value

answer = identity("ready")
print(answer)

Este patrón resulta útil cuando se llamará a la función desde varios lugares, necesita documentación o forma parte de una API pública. La función devuelve su argumento; no lo copia ni lo convierte. Por tanto, si el argumento es un objeto mutable, la referencia devuelta sigue apuntando a ese objeto. Elige una lambda para una función breve en línea y def cuando un nombre y una explicación hagan que el código sea más fácil de leer.

En qué se diferencia la función id() de Python

Usa id(value) cuando necesites el identificador asociado a un objeto, no cuando quieras devolver el valor sin cambios. El entero que devuelve puede ayudar a diagnosticar alias: si first is second es verdadero, ambos nombres apuntan al mismo objeto. El entero concreto depende de la implementación y puede reutilizarse cuando termina el tiempo de vida de un objeto; por ello, codificarlo directamente o guardarlo no es una forma fiable de identificar un objeto entre ejecuciones del programa. Para comparar valores normalmente, usa ==; para el comportamiento de función identidad descrito aquí, devuelve la propia entrada.

El módulo estándar operator no ofrece una función identidad general mediante itemgetter. operator.itemgetter(0) selecciona el elemento de índice cero de una entrada como una lista o una tupla. Es útil para extraer un campo, pero cambia lo que se devuelve y solo funciona con entradas adecuadas, por lo que no equivale a lambda x: x.

Conclusión

Python no tiene una función integrada específica que devuelva su argumento sin cambios. Define una con lambda x: x si necesitas una función breve, o con def cuando te convenga un nombre claro y reutilizable. Distingue este comportamiento de id(), que devuelve un identificador entero del objeto, y de selectores como operator.itemgetter(0), que extraen una parte de la entrada.