Python “topmost.\uuu init\uuu.py”是否可以访问“topmost.submodule.\uuu init\uuu.py”中的全局变量?

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

如果我的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 = 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)