【问题标题】:Python 3 builtins.NameError: global name --- is not defined -Python 3 builtins.NameError:全局名称---未定义-
【发布时间】:2014-04-14 16:51:33
【问题描述】:

这里需要一些指导。这可能是一个愚蠢的错误,但是我收到“builtins.NameError:全局名称-未定义”错误,我不明白为什么-我仍在学习该语言:)。

这是我的代码:

def option(x):
    if x == "E":
        enter()
    elif x == "V":
        view()
    else:
        exit()

def enter():
    msg = input("Enter the message\n")
    main()

def view():
    ##if msg == 0:
    #print("no message yet")
    #main()
    #else:
    print("The message is:", msg )
    main()        

def exit():
    print("Goodbye!")


def main():
    print("Welcome to BBS")
    print("MENU")
    print("(E)nter a message")
    print("(V)iew message")
    print("e(X)it")
    print("Enter your selection:")
    choice = input()
    option(choice)
    #msg = 0

main()

我的问题是,即使我先选择“E”选项,我也会得到这个:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 36, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 33, in main
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 3, in option
    pass
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 11, in enter
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 33, in main
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 5, in option
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 18, in view
builtins.NameError: global name 'msg' is not defined

可以指导一下吗?我一直在搜索信息并没有找到任何东西,我的结论是这可能是非常愚蠢和愚蠢的东西。

另外,正如你们从我评论中看到的那样,我试图通过检查 msg != 0 来限制“视图”给出错误 - 我在 main() 中设置了 msg = 0 -这显然不起作用,因为在通过 enter() 之后它会返回 main() 并再次使 msg == 0 。你们能否将我链接到一个页面/指南,以帮助我了解如何解决这个问题?我不想被勺子喂那么多..

谢谢,

伊达

【问题讨论】:

  • 看看这篇关于scope的文章。

标签: python python-3.x nameerror


【解决方案1】:

这里的问题是enter() 中的msg 是一个局部变量:它是在enter() 函数运行时创建的,当enter() 返回时它不再存在。通常,每当您在函数中设置变量时,您就是在设置局部变量。如果你想设置一个 global 变量,即使在函数返回后它的值也保持不变,请使用 global 语句:

def enter():
    global msg
    msg = input("Enter the message\n")
    main()

也就是说,全局变量通常不是做事的最佳方式。让enter() 函数返回消息而不是将其存储在变量中可能会更好。

【讨论】:

    【解决方案2】:

    msg 是一个不在任何地方使用的名称。这就是您收到NameError 的原因。

    您创建的每个函数都应该是独立的,并且具有直接的输入和输出。

    main 是您的入口点,它应该酌情调用其他函数。

    这些函数将在执行完成后返回给调用者。他们可以并且在某些情况下应该将一些数据返回给他们的调用者。

    例如,这是您问题的一个子集,显示了main 如何调用view 然后返回:

    def view(text):
        if not text:
            print("no message yet")
        else:
            print("The message is:", msg )
    
    def main():
        print("Welcome to BBS")
        print("MENU")
        print("(E)nter a message")
        print("(V)iew message")
        print("e(X)it")
        print("Enter your selection:")
        while not exiting:
            choice = input()
            view(choice)
            exiting = True # TODO: set this based on the value in choice
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2013-11-21
      • 2012-03-28
      • 2022-02-24
      • 2017-02-03
      相关资源
      最近更新 更多