好吧,这对我来说很有趣,我做了一些实验,我通读了http://docs.python.org/reference/executionmodel.html
然后在这里和那里修改你的代码,这就是我能找到的:
代码:
import pprint
def two():
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
print globals()['pprint']
def main():
if 'pprint' in globals():
print 'pprint is in globals()'
global pprint
print globals()['pprint']
pprint.pprint('Spam')
from pprint import pprint
print globals()['pprint']
pprint('Eggs')
def three():
print globals()['pprint']
pprint.pprint('Spam')
if __name__ == '__main__':
two()
print('\n')
three()
print('\n')
main()
输出:
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Eggs'
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
pprint is in globals()
<module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>
'Spam'
<function pprint at 0xb7d596f4>
'Eggs'
在方法two() from pprint import pprint中但不覆盖中的名称pprint,globals因为global关键字未在 的范围内使用two()。
在方法three()中,由于在本地范围内没有pprint名称声明,因此默认为全局名称pprint,即模块
而在 in 中main(),首先使用关键字global ,pprint因此方法范围内的所有引用都main()将引用该global名称pprint。正如我们所看到的,它最初是一个模块,并且在global namespace我们执行的方法中被覆盖from pprint import pprint
虽然这可能无法回答这个问题,但我认为这是一些有趣的事实。
======================
编辑另一个有趣的事情。
如果你有一个模块说:
mod1
from datetime import datetime
def foo():
print "bar"
另一种方法说:
mod2
import datetime
from mod1 import *
if __name__ == '__main__':
print datetime.datetime.now()
乍一看似乎是正确的,因为您已将模块导入datetime.mod2
现在,如果您尝试将 mod2 作为脚本运行,它将引发错误:
Traceback (most recent call last):
File "mod2.py", line 5, in <module>
print datetime.datetime.now()
AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
因为第二个导入from mod2 import * 覆盖了datetime命名空间中的名称,因此第一个import datetime不再有效。
道德:因此,导入的顺序、导入的性质(从 x 导入 *)和导入模块中的导入意识 -很重要。