首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入模块中声明的全局变量的可见性

导入模块中声明的全局变量的可见性
EN

Stack Overflow用户
提问于 2022-03-21 19:54:46
回答 2查看 51关注 0票数 1

我遇到了一个意想不到的事情(至少对我来说是这样!)行为,我正试着理解它。假设我有一个主文件:

main.py

代码语言:javascript
复制
from my_packages.module_00 import my_function

def main():
    my_function()

if __name__ == "__main__":
    main()

并且,在"my_packages“文件夹中,包含"my_function”函数定义的模块module_00和一个全局变量:

module_00.py

代码语言:javascript
复制
global_var = 'global variable'


def my_function():
    print(f'Do I know {global_var}???')

当我运行main.py时,它会输出:

代码语言:javascript
复制
Do I know global variable???

我正在努力弄清楚为什么会起作用。

我希望变量global_var的作用域仅限于定义它的模块( this question的答案似乎证实了这一点)。基本上,我认为导入my_function是通过

代码语言:javascript
复制
from my_packages.module_00 import my_function

等于复制/粘贴main.py中的函数定义。然而,that...the导入的函数似乎以某种方式跟踪函数本身已经定义的模块中声明的全局变量?

还是我漏掉了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-21 20:03:43

然而,

似乎that...the导入的函数在某种程度上跟踪了函数本身已经定义的模块中声明的全局变量?

这正是它所要做的。

代码语言:javascript
复制
>>> from module_00 import my_func
>>> my_func.__globals__['global_var']
'global variable'
>>> module_00.global_var is my_func.__globals__['global_var']
True
>>> module_00.global_var = 3
>>> my_func.__globals__['global_var']
3

__globals__是对定义my_func的模块的全局命名空间的引用。

票数 3
EN

Stack Overflow用户

发布于 2022-03-21 20:03:35

修复几个排版,您的代码就会像预期的那样工作。Python中的每个模块都有自己的私有符号表,用于模块的全局变量。

module_00.py.

  • ref中的
  1. 导入必须是my_func,而不是my_function,与在module_00.py中的f-string中定义的函数名相匹配的函数名必须是{global_var},而不是my_function。

main.py

代码语言:javascript
复制
from my_packages.module_00 import my_func
                                  ^^^^^

def main():
    my_func() # my_func not my_function

if __name__ == "__main__":
    main()

module_00.py

代码语言:javascript
复制
global_var = 'global variable'

def my_func():
    print(f'Do I know {global_var}???')
                       ^^^^^^^^^^

输出:

代码语言:javascript
复制
Do I know global variable???

如果要访问模块的全局变量,则可以导入该模块并使用语法访问该变量: package.module_name.variable_name;例如,my_packages.module_00.global_var

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71563392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档