Python “topmost.\uuu init\uuu.py”是否可以访问“topmost.submodule.\uuu init\uuu.py”中的全局变量?
如果我的Python库顶层的结构如下:Python “topmost.\uuu init\uuu.py”是否可以访问“topmost.submodule.\uuu init\uuu.py”中的全局变量?,python,inheritance,global-variables,modularity,Python,Inheritance,Global Variables,Modularity,如果我的Python库顶层的结构如下: topmost /__init__.py /submodule /__init__.py topmost.\uuuu init\uuuu.py是否可以访问topmost.submodule.\uuuuu init\uuuu.py中的全局变量 对于最顶层的.submodule._init__u;.py,应该有一些全局变量: def characterize(input): global abc abc = lo
topmost
/__init__.py
/submodule
/__init__.py
topmost.\uuuu init\uuuu.py是否可以访问topmost.submodule.\uuuuu init\uuuu.py中的全局变量
对于最顶层的.submodule._init__u;.py,应该有一些全局变量:
def characterize(input):
global abc
abc = load_abc_model()
return abc.func(input)
我已经在topmost.\uuuu init\uuuuuuuuuuuuuuuuuuuuuy.py中尝试过,但是topmost.submodule.\uuuuuu init\uuuuuuuuuuuuy.py中的全局变量仍然无法访问:
from __future__ import absolute_import
from topmost import submodule
__import__('submodule', globals())
但只有abc全局变量在最顶层不可访问。当函数首次执行时,通过函数声明/定义/在函数中定义的全局变量将出现在全局范围中 证明:
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 'abc' in globals()
False
>>> def foo():
... global abc
... abc = 123
... print('foo')
...
>>> 'abc' in globals()
False
>>> foo()
foo
>>> 'abc' in globals()
True
>>>
使用当前设置:
topmost
/__init__.py
/submodule
/__init__.py
以及:
只有在调用topmost.submodule.characterize之后,topmost.submodule.abc才会生效。您还必须在模块名称空间中定义变量,不仅在函数内部。当函数第一次执行时,仅通过函数声明/定义的全局变量将出现。由于某些原因,Python中的全局变量对初学者了解甚少。也许他们希望它能像他们所知道的其他语言一样工作?@Leon,当函数第一次执行时,全局将出现,这是真的吗?我认为全局作用域不会离开模块,除非由最顶层的模块显式导入。@johnlaroy其他语言是C-ish;p这是因为它不在子模块中;p子模块也是如此。我无法在子模块中复制相同的行为:=我有点困惑,但earthy.downloader在earthy.downloader之后仍然无法访问,对吗?在当前设置下,topmost.submodule.abc只有在调用topmost.submodule.characterize之后才会上线。
def characterize(input):
global abc
abc = load_abc_model()
return abc.func(input)