Python:返回列表不起作用

时间:2014-11-15 20:50:24

标签: python python-3.4

我正在尝试创建一个可以在一个类中添加/删除/显示学生的程序,这5个类是列表中的5个列表。

非常感谢帮助。

当我运行此代码时:

global classes
def intro():
    print("Welcome to Powerschool v2.0!")
    print("Actions:")
    print("1. Add Student")
    print("2. Delete Student")
    print("3. Show Students in a Class")
    print("4. Show All Students")
    x = int(input())
    while x<1 or x>4:
        print ("Please choose an action, 1-4.")
        x = int(input())
    if x == 1:
        action1()
    elif x == 2:
        action2()
    elif x == 3:
        action3()
    elif x == 4:
        action4()
    classes = [[],[],[],[],[]]
    return classes
def action1():
    print("Which Class? 1-5")
    a = int(input())
    print("Please enter the student's name.")
    z = input()
    classes[a-1].append(z)
    again()
def action2():
    print ("Which Class? 1-5")
    print ("Which student?")
    again()
def action3():
    print ("Which Class? 1-5")
    y = int(input())
    if y == 1:
        print (classes[0])
    elif y == 2:
        print (classes[1])
    elif y == 3:
        print (classes[2])
    elif y == 4:
        print (classes[3])
    elif y == 5:
        print (classes[4])
    again()
def action4():
    print (classes)
    again()
def again():
    print("Would you like to do something else? y/n")
    h = input()
    if h == "y":
        intro()
    else:
        quit
def main():

    intro()

main()

我的错误是:

Traceback (most recent call last):
  File "C:\Documents and Settings\user1\My Documents\Downloads\az_studenttracker.py", line 67, in <module>
    main()
  File "C:\Documents and Settings\user1\My Documents\Downloads\az_studenttracker.py", line 65, in main
    intro()
  File "C:\Documents and Settings\user1\My Documents\Downloads\az_studenttracker.py", line 19, in intro
    action1()
  File "C:\Documents and Settings\user1\My Documents\Downloads\az_studenttracker.py", line 33, in action1
    classes[a-1].append(z)
NameError: name 'classes' is not defined

我在介绍()结束时做了return classes,但我发现这不起作用。 我遵循了一些建议,没有发生任何事情:/

4 个答案:

答案 0 :(得分:5)

您在classes方法中定义了intro,即使它返回了它,您的action1方法也看不到任何变量在任何地方命名classes

Relevant answer on Python scoperelevant documentation

答案 1 :(得分:2)

return并不能按照您的想法行事。 return语句是一种将执行控制传递回上下文的方法(例如,从intro()main()),能够发回一些信息以供更高的上下文使用。虽然您已将classes传递回main(),但您在此背景下从未对其进行任何操作,因此它会消失。

解决问题的一种方法是将classes声明为全局变量。这是最简单的事情,但通常不是好的设计。您可以在global中声明局部变量classes之前使用intro()关键字执行此操作(请参阅this问题以获取有关global的指导),或者在你的任何职能之外宣布classes

另一种解决方案是将classes作为参数传递给action函数。

在任何一种情况下,您都需要在调用classes函数之前声明action

答案 2 :(得分:1)

classes仅存在于intro():中,您必须将其声明为global变量才能在其他函数中访问它或在函数外声明它。

classes = [[],[],[],[],[]] # can be accessed by action3() ,action4()
def intro():

答案 3 :(得分:1)

这是因为classes超出了后两种方法的范围。因此,您有两种选择:

选项1

将类传递给方法action1(), action2(), etc,如下所示:

def action1(classes)

......以及你打电话的时候:

action1(classes) //with the classes var you just made

选项2(推荐)

只需将classes var放在方法之外或将其声明为global,如下所示:

global classes = [[],[],[],[],[]]

......就在之前:

def intro()

一般来说,您应该了解返回的工作原理;在您编写的代码中没有必要