这是我的代码
__ MAIN_MENU __吡啶:
def main_menu():
global action
action = input("Welcome where do you want to go? > ")
game.py :
from __Main_menu__ import *
main_menu()
print(action)
我想知道你是如何拥有它的,以便__Main_menu__.py
中的行动变量能够在game.py
中重新计算。
当我运行game.py
时,我收到此错误:
Traceback (most recent call last):
File "/Users/gbrown/PycharmProjects/untitled/game.py", line 3, in <module>
print(action)
NameError: name 'action' is not defined
答案 0 :(得分:0)
Python中的Globals是模块的全局,而不是所有模块。 python中的Globals不是C全局的。因此,当您尝试导入*时,您在game.py模块中创建了一个全新的动作全局,但它与 Main_menu .py不同,它是一个新的动作。但是, Main_menu .py中继续存在操作,并且main_menu()函数会对其执行操作。
更好的方法是明确地返回你的变量,但不是你的问题的答案。因此,对于您来说,做您想做的事情,您必须明确导入您想要的内容,并使用模块名称从 Main_Menu .py中提取实际操作全局:
。<强> __ MAIN_MENU __吡啶强>
action = None
def main_menu():
global action
action = input("Welcome where do you want to go? > ")
此处,操作附加到模块/文件 Main_Menu .py。当您尝试导入*时,您将在导入的新模块的上下文中创建一个新的全局操作,其中None为值。但是没有与模块中定义的动作的链接,以及功能菜单更新值的位置。
如果您以更“经典”的方式导入它,并保留路径(导入 Main_menu )或定义特定路径(将_Main_menu__导入为mm),在这种情况下,存在差异,本地全局和其他模块全局之间没有重叠。因此,在这种情况下,可以通过引用路径从模块访问全局。
<强> game.py:强>
import __Main_menu__ as mm
mm.main_menu()
print(mm.action)
在这种情况下,全局永远不会发生冲突,您可以访问mm.action
<强> BUT 强>
这个案例的全球性并非最佳或良好做法。最好有这个: 。<强> __ MAIN_MENU __吡啶强>
def main_menu():
action = input("Welcome where do you want to go? > "
return action
在这里,我们从不使用全球。我们只想让函数给我们一个信息。这就是为什么我们使用return关键字,这意味着:将本地值返回给谁给我打电话。
<强> game.py:强>
from __Main_menu__ import *
action=main_menu()
print(action)
这里,当你调用main_menu()时,main_menu()返回一个值,你会对action变量产生影响。而且你有自己的信息,而不使用全球信息。它更好,因为没有重叠,没有歧义,你可以以更通用的方式使用它。 附:这里有更多信息:Stackoverflow information about it :p