Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3 builtins.NameError:未定义全局名称“”-_Python_Python 3.x_Nameerror - Fatal编程技术网

Python 3 builtins.NameError:未定义全局名称“”-

Python 3 builtins.NameError:未定义全局名称“”-,python,python-3.x,nameerror,Python,Python 3.x,Nameerror,这里需要一些指导。这可能是一个愚蠢的错误,但我得到了“builtins.NameError:global name--is not defined”错误,我不明白为什么——我还在学习语言:) 这是我的密码: def option(x): if x == "E": enter() elif x == "V": view() else: exit() def enter(): msg = input("Enter th

这里需要一些指导。这可能是一个愚蠢的错误,但我得到了“builtins.NameError:global name--is not defined”错误,我不明白为什么——我还在学习语言:)

这是我的密码:

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
回溯(最近一次呼叫最后一次):
文件“C:\ProgramFiles(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第36行,在
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第33行,在main中
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第3行,在选项中
通过
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第11行,输入
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第33行,在main中
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第5行,在选项中
文件“C:\Program Files(x86)\Wing IDE 101 5.0\src\debug\tserver\\u sandbox.py”,第18行,在视图中
builtins.NameError:未定义全局名称“msg”
能给我引路吗?我一直在搜索信息,但没有找到任何东西,我的结论是,这可能是一件非常愚蠢和愚蠢的事情

另外,正如你们可以从我的评论中看到的,我试图通过检查msg!=0——我在main()中设置了msg=0——这显然不起作用,因为在经过enter()之后,它会返回main()并再次设置msg==0。你们能帮我链接到一个页面/指南,帮助我理解如何解决这个问题吗?我不想被人用勺子喂那么多

谢谢


Itachi是一个不适用于任何地方的名称。这就是为什么会出现
名称错误

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

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

这里的问题是
msg
inside
enter()
是一个局部变量:它是在
enter()
函数运行时创建的,当
enter()
返回时它就不存在了。通常,无论何时在函数中设置变量,都是在设置局部变量。如果要设置全局变量,即使在函数返回后仍保留其值,请使用
global
语句:

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

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

看看这篇关于的文章。