好吧,这对我来说很有趣,我做了一些实验,我通读了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 导入 *)和导入模块中的导入意识 -很重要。