¿Por qué "ejemplo = lista (...)" da como resultado "TypeError: el objeto 'lista' no es invocable"? [duplicar]

Resuelto khan shah asked hace 9 años • 14 respuestas

Intenté usar este código de un tutorial en REPL:

example = list('easyhoss')

El tutorial dice que exampledebería ser igual a una lista ['e', 'a', 's', 'y', 'h', 'o', 's', 's']. Pero en su lugar recibí un error:

>>> example = list('easyhoss')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

¿Por qué pasó esto?

khan shah avatar Jun 27 '15 16:06 khan shah
Aceptado

Parece que has sombreado el nombre incorporado list, que apunta a una clase, con el mismo nombre que apunta a una instancia de la misma. Aquí hay un ejemplo:

>>> example = list('easyhoss')  # here `list` refers to the builtin class
>>> list = list('abc')  # we create a variable `list` referencing an instance of `list`
>>> example = list('easyhoss')  # here `list` refers to the instance
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: 'list' object is not callable

Creo que esto es bastante obvio. Python almacena nombres de objetos (las funciones y clases también son objetos) en espacios de nombres (que se implementan como diccionarios), por lo que puedes reescribir prácticamente cualquier nombre en cualquier ámbito. No aparecerá como un error de algún tipo. Como sabrás, Python enfatiza que "los casos especiales no son lo suficientemente especiales como para romper las reglas". Y hay dos reglas principales detrás del problema al que se ha enfrentado:

  1. Espacios de nombres . Python admite espacios de nombres anidados. En teoría, puedes anidarlos infinitamente. Como ya mencioné, son básicamente diccionarios de nombres y referencias a objetos correspondientes. Cualquier módulo que cree obtiene su propio espacio de nombres "global", aunque en realidad es sólo un espacio de nombres local con respecto a ese módulo en particular.

  2. Alcance . Cuando haces referencia a un nombre, el tiempo de ejecución de Python lo busca en el espacio de nombres local (con respecto a la referencia) y, si dicho nombre no existe, repite el intento en un espacio de nombres de nivel superior. Este proceso continúa hasta que no quedan espacios de nombres superiores. En ese caso obtienes un NameError. Las funciones y clases integradas residen en un espacio de nombres especial de alto orden __builtins__. Si declara una variable nombrada listen el espacio de nombres global de su módulo, el intérprete nunca buscará ese nombre en un espacio de nombres de nivel superior (es decir __builtins__). De manera similar, suponga que crea una variable vardentro de una función en su módulo y otra variable varen el módulo. Luego, si hace referencia vardentro de la función, nunca obtendrá el global var, porque hay un varen el espacio de nombres local; el intérprete no tiene necesidad de buscarlo en ningún otro lugar.

Aquí hay una ilustración sencilla.

>>> example = list("abc")  # Works fine
>>> 
>>> # Creating name "list" in the global namespace of the module
>>> list = list("abc")
>>> 
>>> example = list("abc")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> # Python looks for "list" and finds it in the global namespace,
>>> # but it's not the proper "list".
>>> 
>>> # Let's remove "list" from the global namespace
>>> del list
>>> # Since there is no "list" in the global namespace of the module,
>>> # Python goes to a higher-level namespace to find the name. 
>>> example = list("abc")  # It works.

Entonces, como puede ver, las funciones integradas de Python no tienen nada de especial. Y su caso es un mero ejemplo de reglas universales. Será mejor que utilices un IDE (por ejemplo, una versión gratuita de PyCharm o Atom con complementos de Python) que resalte el sombreado de nombres para evitar este tipo de errores.

Quizás también te preguntes qué es un "invocable", en cuyo caso puedes leer esta publicación . list, al ser una clase, se puede invocar. Llamar a una clase desencadena la construcción e inicialización de la instancia. Una instancia también podría ser invocable, pero listlas instancias no. Si está aún más desconcertado por la distinción entre clases e instancias, es posible que desee leer la documentación (muy convenientemente, la misma página cubre espacios de nombres y alcance).

Si desea obtener más información sobre las funciones integradas, lea la respuesta de Christian Dean .

PD: Cuando inicias una sesión interactiva de Python, creas un módulo temporal.

Eli Korvigo avatar Jun 27 '2015 09:06 Eli Korvigo

Antes de que pueda comprender completamente qué significa el error y cómo solucionarlo, es importante comprender qué es un nombre integrado en Python.

¿Qué es un nombre incorporado?

En Python, un nombre integrado es un nombre al que el intérprete de Python ya le ha asignado un valor predefinido . El valor puede ser una función o un objeto de clase . Estos nombres siempre están disponibles de forma predeterminada, sin importar el alcance. Algunos de los valores asignados a estos nombres representan tipos fundamentales del lenguaje Python, mientras que otros son simples y útiles.

A partir de la última versión de Python, 3.6.2 , hay actualmente 61 nombres integrados. Puede encontrar una lista completa de los nombres y cómo deben usarse en la sección de documentación Funciones integradas .

Sin embargo, un punto importante a tener en cuenta es que Python no le impedirá reasignar nombres integrados . Los nombres integrados no están reservados y Python también permite usarlos como nombres de variables.

Aquí hay un ejemplo usando el dictincorporado:

>>> dict = {}
>>> dict
{}
>>>

Como puede ver, Python nos permitió asignar el dictnombre para hacer referencia a un objeto de diccionario .

¿Qué significa "TypeError: el objeto 'lista' no es invocable"?

En pocas palabras, la razón por la que ocurre el error es porque reasignó el nombre integrado list en el script:

list = [1, 2, 3, 4, 5]

Cuando hizo esto, sobrescribió el valor predefinido del nombre integrado . Esto significa que ya no puede usar el valor predefinido de list, que es un objeto de clase que representa la lista de Python.

Por lo tanto, cuando intentaste usar la listclase para crear una nueva lista a partir de un rangeobjeto:

myrange = list(range(1, 10))

Python generó un error. La razón por la que el error dice "el objeto 'lista' no es invocable" es porque, como se dijo anteriormente, el nombre listse refería a un objeto de lista. Entonces lo anterior sería el equivalente a hacer:

[1, 2, 3, 4, 5](range(1, 10))

Lo cual por supuesto no tiene sentido. No se puede llamar a un objeto de lista.

¿Cómo puedo solucionar el error?

Supongamos que tiene un código como el siguiente:

list = [1, 2, 3, 4, 5]
myrange = list(range(1, 10))

for number in list:
    if number in myrange:
        print(number, 'is between 1 and 10')

La ejecución del código anterior produce el siguiente error:

Traceback (most recent call last):
  File "python", line 2, in <module>
TypeError: 'list' object is not callable

Si recibe un error similar como el anterior que dice "un objeto no es invocable", es probable que haya utilizado un nombre integrado como variable en su código. En este y otros casos, la solución es tan simple como cambiar el nombre de la variable infractora . Por ejemplo, para corregir el código anterior, podríamos cambiar el nombre de nuestra listvariable a ints:

ints = [1, 2, 3, 4, 5] # Rename "list" to "ints"
myrange = list(range(1, 10))

for number in ints: # Renamed "list" to "ints"
    if number in myrange:
        print(number, 'is between 1 and 10')

PEP8 , la guía de estilo oficial de Python, incluye muchas recomendaciones sobre cómo nombrar variables.

Este es un error muy común que cometen los usuarios nuevos y antiguos de Python. Por eso es importante evitar siempre el uso de nombres integrados como variables como , str, dict, etc.listrange

Muchos linters e IDE le avisarán cuando intente utilizar un nombre integrado como variable. Si comete este error con frecuencia, puede que valga la pena invertir en uno de estos programas.

No cambié el nombre de un nombre integrado, pero sigo recibiendo "TypeError: el objeto 'lista' no se puede llamar". ¿Lo que da?

Otra causa común del error anterior es intentar indexar una lista usando paréntesis ( ()) en lugar de corchetes ( []). Por ejemplo:

>>> lst = [1, 2]
>>> lst(0)

Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    lst(0)
TypeError: 'list' object is not callable

Para obtener una explicación completa del problema y qué se puede hacer para solucionarlo, consulte TypeError: el objeto 'lista' no se puede llamar al intentar acceder a una lista .

Christian Dean avatar Mar 12 '2019 07:03 Christian Dean

Si está en una sesión interactiva y no desea reiniciar, puede eliminar el sombreado con

del list
user1767754 avatar Apr 03 '2018 21:04 user1767754

En la liga de los estúpidos errores de los lunes por la mañana, usar corchetes en lugar de corchetes al intentar acceder a un elemento de la lista también le dará el mismo mensaje de error:

l=[1,2,3]

print(l[2])#GOOD
print(l(2))#BAD

TypeError: el objeto 'lista' no se puede invocar

Joris avatar Jun 17 '2019 08:06 Joris

Es posible que haya utilizado el nombre integrado 'lista' para una variable en su código. Si está utilizando el cuaderno Jupyter, a veces, incluso si cambia el nombre de esa variable de "lista" a algo diferente y vuelve a ejecutar esa celda, es posible que aún reciba el error. En este caso es necesario reiniciar el Kernal. Para asegurarse de que el nombre haya cambiado, haga clic en la palabra 'lista' cuando esté creando un objeto de lista y presione Shift+ Tab, y verifique si Docstring lo muestra como una lista vacía.

Nombre de lista incorporado usado para mi lista

Cambie el nombre de mi lista a my_list pero aún aparece el error, Shift+Tab muestra que la lista aún contiene los valores de my_list

Reinicie Kernal y todo estará bien.

Kevin avatar Jul 19 '2018 10:07 Kevin