我遇到了一个意想不到的事情(至少对我来说是这样!)行为,我正试着理解它。假设我有一个主文件:
main.py
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
global_var = 'global variable'
def my_function():
print(f'Do I know {global_var}???')当我运行main.py时,它会输出:
Do I know global variable???我正在努力弄清楚为什么会起作用。
我希望变量global_var的作用域仅限于定义它的模块( this question的答案似乎证实了这一点)。基本上,我认为导入my_function是通过
from my_packages.module_00 import my_function等于复制/粘贴main.py中的函数定义。然而,that...the导入的函数似乎以某种方式跟踪函数本身已经定义的模块中声明的全局变量?
还是我漏掉了什么?
发布于 2022-03-21 20:03:43
然而,
似乎that...the导入的函数在某种程度上跟踪了函数本身已经定义的模块中声明的全局变量?
这正是它所要做的。
>>> 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的模块的全局命名空间的引用。
发布于 2022-03-21 20:03:35
修复几个排版,您的代码就会像预期的那样工作。Python中的每个模块都有自己的私有符号表,用于模块的全局变量。
module_00.py.
{global_var},而不是my_function。main.py
from my_packages.module_00 import my_func
^^^^^
def main():
my_func() # my_func not my_function
if __name__ == "__main__":
main()module_00.py
global_var = 'global variable'
def my_func():
print(f'Do I know {global_var}???')
^^^^^^^^^^输出:
Do I know global variable???如果要访问模块的全局变量,则可以导入该模块并使用语法访问该变量: package.module_name.variable_name;例如,my_packages.module_00.global_var
https://stackoverflow.com/questions/71563392
复制相似问题