【问题标题】:Unable to access a global variable无法访问全局变量
【发布时间】:2015-12-11 16:03:12
【问题描述】:

我正在尝试在特定环境中执行一些代码,在该环境中我导入了一些依赖项,但我不断收到错误消息,提示找不到模块。我打开了一个调试器,在全局环境中看到了该模块,但是当我尝试使用普通的作用域方法访问该模块时,python 似乎找不到它。

(Pdb) globals['my_import']
<module 'tmp0fZtOs' from '/tmp/tmp0fZtOs.py'>
(Pdb) my_import
*** NameError: name 'my_import' is not defined

我还发现一些文档提到需要显式引用全局变量才能使它们可用于函数,但是当我尝试以下类似的操作时,我也会收到错误消息。

(Pdb) def temp_function(): global my_import; print my_import
(Pdb) temp_function()
*** NameError: global name 'my_import' is not defined

关于我可以做些什么来使这个模块可用于我的执行代码的任何想法?

【问题讨论】:

  • 你能发一个minimal reproducible example吗?
  • globals['my_import'] ?你是说globals()['my_import'] 吗?
  • 我使用 globals['my_import'] 因为 globals 是一个字典。如果我尝试使用 globals()['my_import'],我会收到一条错误消息,指出字典不可调用。
  • globals 是一个返回字典的内置函数。 globals()[variable_name] 应该给你变量variable_name。也就是说,直到您创建自己的名为globals 的变量,从而隐藏内置的globals。看起来你在这里做了。这似乎是你的问题开始的地方,但你没有发布你的那部分代码......
  • 不管globals 是什么东西,它既不是 Python 内置的,也不是这段代码的实际全局变量 dict。

标签: python scope global-variables


【解决方案1】:

您声明 my_import 是全局的,但您没有为它分配值,因此它不存在。

def temp_function(): 
    global my_import
    my_import = 1
    print(my_import)

temp_function()
if "my_import" in globals().keys():
    print("Variable is global")
    print(globals()['my_import'])

【讨论】:

  • 我不是在尝试初始化一个新的全局变量,而是在尝试访问一个我知道已经存在的变量。
  • "你初始化了你的全局变量,但是你没有给它赋值。" - 在 Python 的执行模型下这实际上是不可能的。没有初始化但无价值的变量。 (可能有一个存在但没有值的本地变量,但没有任何类型的初始化没有值的变量。)
  • 另外,不要打电话给keys
  • 如果不调用keys,就会出现错误。例如:"a" in gloabls().keys 会产生错误,而"a" in globals().keys() 不会。
  • @JoshSmith: 另一方面,"a" in globals() 比使用keys 更正确、更短、更快。特别是在 Python 2 上,使用 keys 对性能来说是灾难性的,因为它会构建一个列表并遍历它以查找密钥。
猜你喜欢
  • 2014-01-17
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2016-11-12
  • 2019-03-29
  • 2012-03-06
相关资源
最近更新 更多