【问题标题】:How to access a variable in a module which is being imported in the main function and which is defined inside main() in python如何访问模块中的变量,该变量在主函数中导入并在 python 的 main() 中定义
【发布时间】:2012-07-17 11:53:16
【问题描述】:

我是 python 的新手。我正在尝试访问在主函数中为 imported 的模块中定义在 main() 内的变量。我想要一种将deviceid 变量传递给get_a()
ma​​in.py:-

的方法来获得这个
global deviceid
import lib
deviceid=123
lib.get_a()

lib.py:-

def get_a():
    global deviceid
    prnit deviceid  

调用main 或尝试从python shell 访问deviceid 正在返回

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "t.py", line 4, in pp print a NameError: global name 'deviceid' is not defined

我尝试在模块和功能内外的许多地方提供global deviceid。没有任何帮助。

请有人帮忙。

【问题讨论】:

  • 看过这里,stackoverflow.com/questions/423379/… deviceid 需要在您似乎正在使用的两个模块之外声明 。您是否尝试在调用 main 之前在 REPL 中声明它?
  • 而不是定义全局变量,在我看来,如果您只是将变量作为参数传递会更好,如下所示:def get_a(deviceid)
  • 除了我完全支持的 dex19dt 的建议之外,您将无法从 lib.py 中导入 main.py,因为您已经导入反之亦然。由于循环依赖,尝试这样做会失败。
  • 传递参数会起作用。然后我想在很多地方编辑代码。上面显示的示例只是一个大文件的一部分。谢谢。
  • 另一种方法是将deviceid 添加到第三个文件中。

标签: python python-2.7 jython


【解决方案1】:

Python 中没有对整个程序是全局的名称。 Python 中的全局变量对特定模块是全局的。要在多个模块中使用一个值,请将其名称从一个模块导入另一个模块,使其在两个模块中可用:

# main.py
import lib
deviceid = 123
lib.get_a()

# lib.py
import main
def get_a():
    print main.deviceid

正如其他评论者所指出的,不使用全局变量可能是更好的选择。

# main.py
import lib
deviceid = 123
lib.get_a(deviceid)

# lib.py
def get_a(deviceid):
    print deviceid

【讨论】:

  • 您的第一个代码 sn-p 有点危险。它将按照编写的方式运行,但如果“全局”是可变的,或者是从 main.py 修改的,您会得到令人惊讶的效果,因为模块 main 和从 main.py 执行脚本的模块是两个不同的模块。跨度>
  • 我不确定您所说的“令人惊讶”是什么意思。如果该值是要共享的,并且是可变的,那么确实如此,您需要确保您希望每个人都能看到更改,因为每个人都会看到。
  • 抱歉,要明确一点:如果您运行在模块 __main__ 中运行的脚本 main.py,但 lib.py 会导入模块 main,因此它会获得一个单独且不同的副本main.py 中定义的任何全局变量。对于一个无关紧要的不可变值,但对于列表或字典或用户定义类的实例来说很重要。这对课程本身也很重要。 surprising 与您所说的相反:不是每个人都会看到这些变化。
【解决方案2】:

可以将deviceid变量放在lib模块中,通过lib.deviceid使用

如果您通过执行lib.deviceid = X 在代码中某处更改 deviceid 的值,并且如果您在其他地方重新导入 lib 模块并再次请求该 deviceid,它将具有 X 作为值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2014-02-10
    • 1970-01-01
    • 2023-04-05
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多