NameError: имя 'uinput' не определено, ошибка в Python - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь сделать простое приложение CLI для списков задач. Что тут происходит? Это потому, что я имею в виду переменную, которая находится внутри функции?

Я пытался поместить "global" за uinput, но это говорит о том, что "=" не был допустимым синтаксисом или чем-то в этом роде. Не совсем уверен, почему, я тоже некоторое время пытался поискать в гугле и ничего не нашел, извините, если это очевидно.

userlist = []

 def maininput():
     uinput = input("What would you like to add to your list?")
     userlist.append(uinput)
     for i in userlist:
         print(userlist)
         break


 while uinput != "exit":
     maininput()

Я хотел бы, чтобы «uinput» мог распознавать оператор while

Ответы [ 4 ]

0 голосов
/ 28 апреля 2019

Вы помещаете последнее входное слово в userlist, и легко получить доступ к userlist содержимому из основного цикла, потому что 100 userlist инициализируется в главном ②, когда функция ищет список, к которому добавляется пользователь. вход находит userlist во внешней области видимости, а 100 userlist является изменяемым объектом, изменения которого видны из каждой точки области видимости.

userlist = []

def ask():
    new = input('...')
    userlist.append(new)
    if new == 'exit' : return
    print('List contains', ', '.join(s for s in userlist))

while userlist[-1:] != ['exit']:
    ask()

(мы пишем тест следующим образом: userlist[-1:] != ['exit'], потому что при первом проходе userlist пуст и его индексация, а не извлечение фрагмента вызовет ошибку).

Конечно, это ПЛОХАЯ ПРАКТИКА, потому что мы вводим сильную связь между основной и функцией, гораздо лучше явно передать список в списке аргументов:

userlist = []

def update_list(a_list):
    new = input('...')
    a_list.append(new)
    if new == 'exit' : return
    print('List contains', ', '.join(s for s in a_list))

while userlist[-1:] != ['exit']:
    update_list(userlist)
0 голосов
/ 28 апреля 2019

Используйте цикл while True, чтобы разбить ваш список внутри maininput, вместо использования глобального, как показано ниже.Также вы можете распечатать список напрямую, используя print(userlist) вместо цикла for

userlist = []
def maininput():
    while True:
        uinput = input("What would you like to add to your list? Type exit to stop>>")
        #Exit the loop when you type exit
        if uinput == "exit":
            break
        #Else append to list and print it
        userlist.append(uinput)
        print(userlist)

#Call the main function
maininput()

Выводы будут выглядеть как

What would you like to add to your list? Type exit to stop>>a
['a']
What would you like to add to your list? Type exit to stop>>b
['a', 'b']
What would you like to add to your list? Type exit to stop>>c
['a', 'b', 'c']
What would you like to add to your list? Type exit to stop>>d
['a', 'b', 'c', 'd']
What would you like to add to your list? Type exit to stop>>exit
0 голосов
/ 28 апреля 2019

Краткий ответ: да, это потому, что вы ссылаетесь на имя, которое определено внутри функции.Теперь вам известна концепция, называемая «scoping».

Внутри любой функции Python имена разрешаются путем просмотра в трех местах по порядку:

  1. Создано локальное пространство имен вызова функции, созданноекогда функция вызывается и уничтожается, когда возвращается или иным образом завершается;
  2. глобальное пространство имен модуля, в котором определяются классы и функции верхнего уровня;
  3. встроенная пространство имен, которое содержит предопределенные значения Python, такие как None, Exception - все имена, являющиеся частью языка Python.

За пределами функции, операторы (иногда упоминаемыев качестве операторов верхнего уровня) локальные и глобальные пространства имен совпадают.

Когда интерпретатор компилирует вызов функции, любые имена, которые связаны (путем присвоения им значения или определения вложенного класса или функции)Предполагается, что они являются локальными для этого вызова.Вот почему операторы верхнего уровня не могут ссылаться на uinput.

Другие ответы дали вам некоторое представление о лучшей структуре зацикливания.Я бы посоветовал вам по мере роста вашего уровня знаний исследовать такие модули, как pickle и shelve или даже dbm, которые позволят вашим спискам дел остаться в силе.между запусками программы.

0 голосов
/ 28 апреля 2019

Вы должны объявить свой uinput в своей функции глобально следующим образом:

global uinput
uinput = input("...")

В глобальной области видимости (перед объявлением функции) следует указать значение для uinput

uinput = input("...")

Intead of ..., вы должны заполнить строку ввода

...