Python新手:我如何定义';nl';在我的节目里?

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

对编码还不熟悉,我正在挑战自己编写一个程序,用户将值输入到一个列表中,然后按另一个输入值对它们进行排序。当我运行程序时,我得到一个回溯错误,说“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)
def列表排序(l1):
对于l1中的num:
n1=[]

如果num
n1
只有函数作用域,则只能在函数内部访问方法。
在两个函数中都将变量声明为
global n1

nl在newlist中声明,并且您在该函数中仅对该变量具有作用域,如果您希望从外部访问该变量,则应在函数外部声明nl,并将其作为参数发送到“newlist”


Python中有两个作用域,即局部作用域和全局作用域。局部作用域变量是在一个函数内声明的,而该函数不能在定义它的函数外访问。您已经在函数中定义了“nl”。所以,你不能在这个函数之外访问它。因此,这个错误的原因是

您的问题的答案围绕着一个称为范围的想法,理解范围将使将来更容易解决类似的问题。每个人的学习方式都不一样,所以不要觉得你现在就必须知道所有这些,但是如果你想知道细节,请继续阅读

范围 程序中的每个变量都存在于一个称为作用域的对象中。这是你的程序图。它有三个作用域—全局作用域和每个函数的作用域,
listsort
newlist
。每个函数都有自己的作用域,每个Python文件都有自己的全局作用域

变量的作用域取决于它的引入位置。引入变量的一些方法是赋值(例如
n1
nl
l_inp
inp
都用
=
符号赋值),作为for循环变量(例如
num
x
都是循环变量)和函数参数(
l1
是一个函数参数)。变量位于引入变量的最紧密范围内

您可以看到作用域是嵌套的。函数作用域位于全局作用域内。这一点很重要。您可以看到
inp
变量位于全局作用域内,但它仍然可以在
listsort
作用域中使用,因为
listsort
作用域位于全局作用域内。函数作用域内的代码可以“向外看”全局范围内的变量。但是全局范围内的代码不能“查看”函数范围内的变量

好的,那么我如何从函数中得到变量呢? 当函数返回时,函数作用域中的变量会消失。但是您可以返回变量的值。您的函数
newlist
返回
nl
的值。但是该值会消失在哪里?嗯,没有,因为您的程序没有将其分配给变量。您可以通过编写以下命令来实现:

nl = newlist()
这将把值保存到全局范围内名为
nl
的新变量中。但这是与
newlist
中的
nl
不同的变量。当然,您可以使用任何您喜欢的变量名,只是因为您将此值存储在
newlist
内名为
nl
的变量中并不意味着您必须这样做将其放在全局范围内具有相同名称的变量中。您可以编写:

gl = newlist()
然后在以后使用:

listsort(gl)

这也同样有效。

您不能使用在该函数之外的函数中声明的变量。只需将
newlist()
更改为
nl=newlist()
您不保存
newlist()中的值
。您需要保存它才能使用它。谢谢!我在函数外部声明了变量,它起了作用。这是非常有用的信息!我喜欢视觉效果。我保存了返回值,正如大多数人所建议的那样,这消除了回溯。问题是,它没有输出所需的排序列表。是的,您有一些问题需要解决我们要弄清楚。编写自己的排序算法有点困难!如果你自己无法弄清楚事情,你可能会想问一个新问题。顺便说一句,只从列表中选择具有某些属性的内容通常称为“筛选”,而不是“排序”。如果你问另一个问题,这可能会有所帮助。祝你好运!