Новичок в Python: как мне определить ‘nl’ в моей программе?

#python

#python

Вопрос:

Новичок в программировании, и я бросаю себе вызов написать программу, в которой пользователь вводит значения в список и сортирует их по другому входному значению. Когда я запускаю программу, я получаю ошибку обратной трассировки, в которой говорится, что ‘nl’ не определен. Я думаю, что у меня что-то не в порядке или я что-то неправильно использую. Несколько советов были бы полезны!

 def listsort(l1):
  for num in l1:
    n1 = []
    if num <= inp:
      n1.append(num)
      for x in n1:
        print(x, end=' ')

def newlist():
  nl = []
  while True:
    l_inp = input('Add to list: ')
    if l_inp == 'done':
      return nl
    else:
      float(l_inp)
      nl.append(l_inp)
      continue

newlist()
inp = float(input('Enter a number: '))
print('These numbers are less than or equal to', inp)
listsort(nl)
  

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

1. Вы не можете использовать переменную, объявленную в функции вне этой функции. Просто измените newlist() на nl = newlist()

2. Вы не сохраняете свое значение из newlist() . Вам нужно сохранить его, чтобы использовать.

Ответ №1:

n1 имеет область действия только функции, означает, что доступ возможен только внутри функции. Объявите переменную как global n1 внутри обеих функций.

Ответ №2:

nl объявлен в newlist, и у вас есть область видимости только для этой переменной в этой функции, если вы хотите получить к ней доступ извне, тогда вы должны объявить nl вне функции и отправить его в качестве параметра в «newlist»

ошибка в оболочке python, показывающая область действия nl

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

1. Спасибо! Я объявил переменную вне функции, и это сработало.

Ответ №3:

В Python есть две области, а именно локальная и глобальная. Локальная переменная области видимости объявляется внутри функции, к которой нельзя получить доступ за пределами функции, в которой она определена. Вы определили ‘nl’ внутри функции. Итак, вы не можете получить к нему доступ за пределами этой функции. Следовательно, причина этой ошибки

Ответ №4:

Ответ на ваш вопрос вращается вокруг идеи, называемой scope, и понимание областей значительно облегчит решение подобных проблем в будущем. Все учатся по-разному, поэтому не думайте, что вам обязательно знать все это прямо сейчас, но если вы хотите узнать подробности, читайте дальше!

Область видимости

Каждая переменная в вашей программе существует в чем-то, называемом областью видимости. Вот схема вашей программы. Он имеет три области — глобальную область и область для каждой функции, listsort и newlist . Каждая функция имеет свою собственную область видимости, и каждый файл Python имеет свою собственную глобальную область видимости.

Программа снабжена аннотациями для обозначения трех областей: global, listsort и newlist

В какую область видимости попадает переменная, зависит от того, где она введена. Некоторые способы введения переменных — это присвоение (например, n1 , nl , l_inp и inp все присваиваются с помощью = символа), как переменная цикла for (например, num и x являются переменными цикла) и как функциональный параметр ( l1 является параметром функции). Переменная находится в самой ограниченной области видимости вокруг того места, где она введена.

Вы можете видеть, что области вложены. Области функций находятся внутри глобальной области. Это важно. Вы можете видеть, что inp переменная находится в глобальной области видимости, но ее все еще можно использовать в listsort области видимости, потому что listsort область видимости находится внутри глобальной области видимости. Код внутри области видимости функции может «видеть» переменные в глобальной области видимости. Но код в глобальной области видимости не может «видеть» переменные в области видимости функции.

Хорошо, итак, как мне получить переменные из функции?

Переменные в области видимости функции исчезают, когда функция возвращается. Но вы можете вернуть значение переменной. Ваша функция newlist возвращает значение nl . Но куда девается это значение? Ну, нигде, потому что ваша программа не присваивает его переменной. Вы можете сделать это, написав:

 nl = newlist()
  

Это сохранит значение в новой переменной, вызываемой nl в глобальной области видимости. Но это другая переменная, чем в nl in newlist . Вы, конечно, можете использовать любое имя переменной, которое вам нравится, только потому, что вы сохранили это значение в переменной с именем nl inside newlist , не означает, что вы должны поместить его в переменную с тем же именем в глобальной области видимости. Вы могли бы написать:

 gl = newlist()
  

А затем позже использовать:

 listsort(gl)
  

И это сработало бы так же хорошо.

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

1. Это была действительно полезная информация! Мне нравятся визуальные эффекты. Я сохранил возвращаемое значение, как и предлагало большинство людей здесь, что избавило от обратной трассировки. Проблема в том, что он не выводит желаемый отсортированный список.

2. Да, вам нужно разобраться с несколькими вещами. Написать свой собственный алгоритм сортировки — это своего рода вызов! Возможно, вы захотите задать новый вопрос, если не можете разобраться самостоятельно. Кстати, выбор только тех элементов в списке, которые обладают некоторым свойством, обычно называется «фильтрацией», а не «сортировкой». Это может помочь, если вы задаете другой вопрос. Удачи!