TypeError: объект 'list' не вызывается в python

Я новичок в Python и следую учебнику. В учебнике приведен пример list:

example = list('easyhoss')

Теперь, в учебнике, example= ['e','a',...,'s']. Но в моем случае я получаю следующую ошибку:

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

Скажите, пожалуйста, где я ошибаюсь. Я искал SO этот, но это другое.

Ответы

Ответ 1

Похоже, вы скрыли встроенный list имен, указывающий на класс с тем же именем, указывающим на его экземпляр. Вот пример:

>>> 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

Я считаю, что это довольно очевидно. Python хранит имена объектов (функции и классы также являются объектами) в словарях (пространства имен реализованы в виде словарей), поэтому вы можете переписать практически любое имя в любой области видимости. Это не будет отображаться как какая-то ошибка. Как вы, возможно, знаете, Python подчеркивает, что "особые случаи не настолько особенные, чтобы нарушать правила". И есть две основные правила, стоящие за проблемой, с которой вы столкнулись.

  1. Пространства имен. Python поддерживает вложенные пространства имен. Теоретически вы можете бесконечно вкладывать пространства имен. Как я уже упоминал, пространства имен - это в основном словари имен и ссылок на соответствующие объекты. Любой созданный вами модуль получает свое собственное "глобальное" пространство имен. На самом деле это просто локальное пространство имен по отношению к этому конкретному модулю.

  2. Обзорный. Когда вы ссылаетесь на имя, среда выполнения Python ищет его в локальном пространстве имен (относительно ссылки) и, если такого имени не существует, повторяет попытку в пространстве имен более высокого уровня. Этот процесс продолжается до тех пор, пока не останется более высоких пространств имен. В этом случае вы получаете NameError. Встроенные функции и классы находятся в специальном пространстве имен высокого порядка __builtins__. Если вы объявите переменную с именем list в глобальном пространстве имен вашего модуля, интерпретатор никогда не будет искать это имя в пространстве имен более высокого уровня (то есть __builtins__). Аналогично, предположим, что вы создали переменную var внутри функции в вашем модуле, а другую переменную var в модуле. Затем, если вы ссылаетесь на var внутри функции, вы никогда не получите глобальный var, потому что в локальном пространстве имен есть var - интерпретатору не нужно искать его где-либо еще.

Вот простая иллюстрация.

    >>> 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 not the proper "list".
    # Let 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.

Итак, как вы видите, в Python нет ничего особенного. И ваш случай - просто пример универсальных правил. Вам лучше использовать IDE (например, бесплатную версию PyCharm или Atom с плагинами Python), которая выделяет затенение имен, чтобы избежать таких ошибок.

Вам также может быть интересно, что такое "вызываемый", и в этом случае вы можете прочитать следующий пост: fooobar.com/questions/28753/.... list, будучи классом, вызывается. Вызов класса запускает конструирование и инициализацию экземпляра. Экземпляр может также вызываться, но экземпляры list - нет. Если вы еще более озадачены различием между классами и экземплярами, то вы можете прочитать документацию (довольно удобно, эта же страница охватывает пространства имен и область видимости).

Если вы хотите узнать больше о встроенных функциях, прочитайте ответ Кристиана Дина.

PS

Когда вы запускаете интерактивный сеанс Python, вы создаете временный модуль.

Ответ 2

Прежде чем вы сможете полностью понять, что означает ошибка и как ее решить, важно понять, что такое встроенное имя в Python.

Что такое встроенное имя?

В Python встроенное имя - это имя, которому интерпретатор Python уже назначил предопределенное значение. Значением может быть либо функция, либо объект класса. Эти имена всегда доступны по умолчанию, независимо от области действия. Некоторые из значений, присвоенных этим именам, представляют фундаментальные типы языка Python, а другие просто полезны.

Начиная с последней версии Python - 3.6.2 - в настоящее время имеется 61 встроенное имя. Полный список имен и того, как их следует использовать, можно найти в разделе документации " Встроенные функции".

Однако важно отметить, что Python не помешает вам переназначить встроенные имена. Встроенные имена не зарезервированы, и Python позволяет использовать их как имена переменных.

Вот пример использования встроенного в dict:

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

Как видите, Python позволил нам присвоить имя dict для ссылки на объект словаря.

Что означает "TypeError: объект list" не вызывается "?

Проще говоря, причина возникновения ошибки заключается в том, что вы повторно присвоили встроенный list имен в сценарии:

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

Когда вы это сделали, вы перезаписали предопределенное значение встроенного имени. Это означает, что вы больше не можете использовать предопределенное значение list, который является объектом класса, представляющим список Python.

Таким образом, когда вы пытались использовать класс list для создания нового списка из объекта range:

myrange = list(range(1, 10))

Python поднял ошибку. Причина, по которой ошибка говорит "объект списка" не может быть вызван ", заключается в том, что, как сказано выше, list имен ссылался на объект списка. Таким образом, вышесказанное будет эквивалентно выполнению:

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

Что, конечно, не имеет смысла. Вы не можете вызвать объект списка.

Как я могу исправить ошибку?

Предположим, у вас есть такой код:

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')

Запуск вышеуказанного кода приводит к следующей ошибке:

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

Если вы получаете аналогичную ошибку, такую как та, что выше: "объект не может быть вызван", скорее всего, вы использовали встроенное имя в качестве переменной в своем коде. В этом и других случаях исправить это так же просто, как переименовать переменную. Например, чтобы исправить приведенный выше код, мы могли бы переименовать нашу переменную list в 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 - официальное руководство по стилю Python - содержит множество рекомендаций по именованию переменных.

Это очень распространенная ошибка, которую делают новые и старые пользователи Python. Вот почему важно всегда избегать использования встроенных имен в качестве переменных, таких как str, dict, list, range и т.д.

Многие линтеры и IDE предупреждают вас, когда вы пытаетесь использовать встроенное имя в качестве переменной. Если вы часто совершаете эту ошибку, может быть, стоит потратить время на покупку одной из этих программ.

Я не переименовал встроенное имя, но я все еще получаю "TypeError: объект list" не вызывается ". Что дает?

Другая распространенная причина вышеуказанной ошибки - попытка проиндексировать список, используя круглые скобки (()), а не квадратные скобки ([]). Например:

>>> 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

Для объяснения полной проблемы и того, что можно сделать для ее устранения, см. TypeError: объект list не вызывается при попытке доступа к списку.

Ответ 3

Если вы находитесь в интерактивном сеансе и не хотите перезапускать, вы можете удалить затенение с помощью

del list

Ответ 4

Возможно, вы использовали встроенное имя "список" для переменной в вашем коде. Если вы используете ноутбук Jupyter, иногда, даже если вы измените имя этой переменной с "list" на что-то другое и перезапустите эту ячейку, вы все равно можете получить ошибку. В этом случае вам нужно перезапустить Kernal. Чтобы убедиться, что имя изменилось, нажмите на слово "список" при создании объекта списка и нажмите Shit + Tab, и проверьте, показывает ли Docstring его как пустой список.

Used Built-in list name for my list

Change my list name to my_list but still get error, Shift+Tab shows that list still hold the values of my_list

Restart Kernal and it's all good

Ответ 5

Почему TypeError: 'list' object is not callable?

Объяснение:

Это потому, что вы определили list как переменную раньше (я уверен), так что это будет список, а не функция, поэтому каждый не должен называть переменные функциями, ниже то же самое, что вы делаете сейчас:

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

Так что вам нужно, чтобы она была функцией list по умолчанию, как определить, есть ли она? просто используйте:

>>> list
<class 'list'>
>>> list = [1,2,3]
>>> list
[1, 2, 3]
>>> list()
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    list()
TypeError: 'list' object is not callable
>>> 

Как определить, является ли имя переменной функцией? ну, просто посмотрите, имеет ли он другой цвет, или используйте код вроде:

>>> 'list' in dir(__builtins__)
True
>>> 'blah' in dir(__builtins__)
False
>>> 

После этого вы должны знать, почему TypeError: 'list' object is not callable.

Хорошо, теперь...

Как исправить эту TypeError: 'list' object is not callable ошибку?

Код:

Вы должны либо сделать __builtins__.list():

>>> list = [1,2,3]
>>> __builtins__.list()
[]
>>> 

Или используйте []:

>>> list = [1,2,3]
>>> []
[]
>>> 

Или удалите переменную list из памяти:

>>> list = [1,2,3]
>>> del list
>>> list()
[]
>>> 

Или просто переименуйте переменную:

>>> lst = [1,2,3]
>>> list()
[]
>>> 

PS Последний, пожалуй, самый предпочтительный :-)

Есть целый ряд решений, которые работают.

Рекомендации:

'id' - неверное имя переменной в Python

Как использовать ключевое слово в качестве имени переменной?

Как использовать зарезервированное ключевое слово в качестве имени переменной в Python?

Ответ 6

Я получил эту ошибку по другой причине:

Я случайно создал пустой список в своем __init__ который имел то же имя, что и метод, который я пытался вызвать (я только что закончил рефакторинг, и переменная больше не нужна, но я пропустил ее при очистке). Поэтому, когда я создавал экземпляр класса и пытался вызвать метод, он подумал, что ссылается на объект списка, а не на метод:

class DumbMistake:
    def __init__(self, k, v):
        self.k = k
        self.v = v
        self.update = []

    def update(self):
        // do updates to k, v, etc

if __name__ == '__main__':
    DumbMistake().update('one,two,three', '1,2,3')

Поэтому он пытался присвоить две строки self.update [] вместо вызова метода update(). Убрал переменную и все заработало как задумано. Надеюсь, это кому-нибудь поможет.

Ответ 7

В лиге глупых ошибок в понедельник утром использование круглых скобок вместо квадратных при попытке получить доступ к элементу в списке также даст вам то же сообщение об ошибке:

l=[1,2,3]

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

TypeError: объект 'list' не вызывается

Ответ 8

Для меня это был сервер флагов, возвращающий некоторый массив videos (который я ожидал в формате json..)

добавление json.dumps(videos) исправлено эту проблему

Ответ 9

Я преобразовал список в словарь, это решило мою проблему.

Ответ 10

Чтобы устранить ошибку, подобную этой: "list object is not callable in python", даже если вы изменяете имя переменной, затем перезапустите ядро в Python Jutyter Notebook, если вы его используете, или просто перезапустите IDE.

Я надеюсь, что это сработает. Спасибо!!!