如何在不同文件上使用带有输入的变量?

时间:2015-10-30 12:28:23

标签: python pycharm

这是我的代码

__ 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

1 个答案:

答案 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