вызов функции по ключевому слову rigid python

#python #list #object #variables #keyword

#python #Список #объект #переменные #ключевое слово

Вопрос:

почему объект списка не вызывается внутри функции??

код:

 def unique_list(list1):
    
    sets=set(list1)
    
    u_list=(list(sets))
    
    print("old list",list1)
    print('unique list',u_list)

list1=[1,1,2,3,4,4,5]
unique_list(list1)
  

когда я это сделал.. Я получил точный результат [1,2,3,4,5]... , НО
если я использую list вместо list1 или любого другого имени, например, следующего кода:

 def unique_list(list):
     sets=set(list)
    u_list=(list(sets))
    print("old list",list)``
    print('unique list',u_list)

list=[1,1,2,3,4,4,5]
unique_list(list)
  

python выдает ошибку:

 TypeError: 'list' object is not callable
  

по этой причине жесткие ключевые слова не должны использоваться в качестве имени переменной?? или по другим причинам??

Комментарии:

1. Не используйте list as name, таким образом вы переопределяете встроенную функцию list() , которую вы пытаетесь использовать внутри функции. То же самое относится ко всем встроенным функциям, модулям из стандартной библиотеки и т. Д.

2. Не используйте зарезервированные ключевые слова, кроме list как будет работать

3. когда вы вызываете u_list=(list(sets)) , как вы ожидаете, что Python узнает, что в этой строке (но не в других) list подразумевается встроенная функция Python, а не аргумент функции с тем же именем? Ответ: это невозможно.

Ответ №1:

Вот рабочий код для того, что вы хотите сделать

 def unique_list(list1):
    print("old list",list1)
    print('unique list',(list(set(list1))))

list1=[1,1,2,3,4,4,5]
unique_list(list1)
  

вот почему ваш код не работал

давайте посмотрим на код, который определяет вашу функцию

 def unique_list(list):
    #code
  

list это имя класса и list() функция, которая является родной для python; делая его параметром и / или переменной, вы переопределяете его!

Итак, когда вы вызываете list(set(list)) его, в основном говоря: parameter(set(parameter))

Очевидно, что параметр не может быть функцией и списком одновременно; так что нет никакого сценария, в котором это могло бы сработать.

Я рекомендую использовать условные имена, подобные so, если вы не уверены, как называть список:

 lst = []
x = []
l = []
  

Единственный раз, когда вы должны когда-либо вводить какое-либо из этих имен отдельно в определение функции, — это через type-hinting

 def foo(s: str, l: list) -> list:
    #do code
    return l   list(s)
  

В заключение…ужасная практика использовать любые встроенные имена функций / классов в python в качестве переменных / функций, если вы на самом деле не пытаетесь их переопределить.