如果您这样修改subtwo.py,那么它将起作用import subone
print subone.a
在subtwo.py中执行subone.a时,您试图访问subtwo.py中的命名空间子行,并且在命名空间“subone”中,应该有一个属性“a”。
在subtwo.py中导入subone时,subone将被添加到命名空间中,并且subone命名空间具有属性a.so subone.a将起作用。
我还建议您使用dir()来查看如何添加名称空间。
在subtwo.py中,可以执行以下操作:print dir()
import subone
print dir()
print subone.a
同样,尝试在import语句前后添加“print dir()”,您应该会明白这一点。"import x" adds 'x' to the current modules
namespace while "from x import * " will
add all the module level attributes
directly into current module namespace
因此在上面的第一个main.py、subone.py和subtwo.py示例中,main.py中的命名空间将包含“subone”和“subtwo”,而subtwo.py中的命名空间将为空,并且无法访问subone.a.
[编辑:更多解释]
考虑以下文件:
主.pyprint "Before importing subone : ", dir()
import subone
print "After importing subone and before importing subtwo: ", dir()
import subtwo
print "After importing subone and subtwo: ", dir()
苏伯纳.pya = 'abc'
子图.pyprint dir()
import subone
print "module level print: ", subone.a
print dir()
def printX():
print subone.a
以及running main.py的输出:Before importing subone : ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
After importing subone and before importing subtwo: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone']
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
module level print: abc
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone']
After importing subone and subtwo: ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'subone', 'subtwo']Some Observations您会注意到导入module subtwo.py时,会立即执行print语句。
因此,当在main.py中导入subone和subtwo时,main.py的名称空间将增加。
这并不意味着子工作组的名称空间将被增加。所以“a”只在main.py中通过subone.a可用
当我们在subtwo.py中导入子行时,子行的名称空间被subone扩展,模块subone的属性a通过subone.a在subow.py中可用