Python: función y variable con el mismo nombre

Mi pregunta es ¿por qué no puedo volver a llamar a la función? O, ¿cómo hacer eso?

Supongamos que tengo esta función:

def a(x, y, z): if x: return y else: return z 

y lo llamo con:

 print a(3>2, 4, 5) 

Tengo 4.

Pero imagine que declaro una variable con el mismo nombre que la función (por error):

 a=2 

Ahora, si bash hacer:

 a=a(3>4, 4, 5) 

o:

 a(3>4, 4, 5) 

Obtendré este error: “TypeError: el objeto ‘int’ no se puede llamar”

¿No es posible asignar la variable ‘a’ a la función?

Después de hacer esto:

 a = 2 

a ya no es una función , es solo un número entero (¡la reasignó!). Así que, naturalmente, el intérprete se quejará si intentas invocarlo como si fuera una función, porque estás haciendo esto:

 2() => TypeError: 'int' object is not callable 

Línea inferior: no puede tener dos cosas simultáneamente con el mismo nombre, ya sea una función, un entero o cualquier otro objeto en Python. Solo usa un nombre diferente

los nombres en python suelen ser identifiers para un tipo específico, más como nombrar un cuadro que almacena una variable / función / método o cualquier objeto en python. Cuando está reasignando, simplemente está cambiando el nombre de un cuadro.

Puedes averiguarlo haciendo lo siguiente.

Inicialmente a se le asigna un valor 9 , en la ubicación 140515915925784 . Tan pronto como uso el mismo identificador para una función, a ahora se refiere a una casilla que contiene la dirección de esa función en 4512942512

Al reasignar 3 nuevo a 3 apunta a para referirse a una dirección diferente.

 >>> a = 9 >>> id(a) 140515915925784 >>> def a(x): ... return x ... >>> id(a) 4512942512 >>> a  >>> >>> >>> >>> a = 3 >>> id(a) 140515915925928 >>> a 3 >>> 

Está asignando el nombre a a una definición de función y luego reasignándolo a un entero.

Es sintácticamente correcto, pero no es lo que quieres.

Es mejor dar a las funciones nombres semánticos que describan lo que estás haciendo con los argumentos que se les pasan, y dar nombres semánticos a las variables que describan a qué objeto apuntan. Si lo haces, tendrás un código más legible y ciertamente no volverás a cometer este error.