有两个脚本:
#imptee.py
foo = "abc"
def show():
print "foo from imptee:",foo#impter.py:
#!/usr/bin/env python
from imptee import *
show()
foo = 123
print "foo from impter:",foo
show()当我运行impter.py时,它会产生以下结果:
美国广播公司
foo
打气: 123
美国广播公司( abc )
我只是不明白为什么在将123赋值给变量foo之后,show()仍然打印'abc',而不是123。我认为,在"from import *“之后,foo和show()现在在全局命名空间中,并且没有本地名称空间。我确实理解搜索序列应该是:本地名称空间、全局命名空间、bulit ins名称空间。那么,为什么呢?有人能帮我一下吗?太棒了!
发布于 2012-06-09 19:20:34
模块有单独的名称空间。当您从一个模块导入另一个模块时,您将从源模块导入值(通常是函数,但在本例中是文字"abc"),并将它们分配给目标模块中的名称。
当您执行from imptee import *时,您将它们分配给与源模块中相同的名称,但这实际上不会更改源模块中的指针。只是重复了名字。
当您在导入之后更改目标模块中的赋值时,这不会改变源模块中的任何内容,因为尽管名称看起来相同,但它们是单独的指针,可以指向不同的事物。
如果您执行import imptee,然后手动分配值:foo = imptee.foo,这可能会更清楚。然后,您将执行foo = 123,在目标模块中foo的值已经更改,但是源模块中同名指针的值却没有变化。
发布于 2012-06-09 19:18:19
Python中所谓的“全局命名空间”实际上是模块名称空间。每个模块都有一个,并且它们是独立的。因此,从*导入imptee会将来自imptee的对象引用复制到__main__中;即使在事实发生之后,imptee仍然有自己的命名空间,show()对此有一个引用。
发布于 2012-06-09 19:16:54
因为语句from imtee import * (大约)与from imptee import foo相同,而后者也(大约)与import imptee; foo = imptee.foo相同。因此,foo不会在imptee中更改,原因是将相同的值分配给两个变量,然后更改其中的一个变量不会改变另一个变量中的值:
>>> a = "hello"
>>> b = a
>>> a
'hello'
>>> b
'hello'
>>> b = 'world'
>>> a
'hello'
>>> b
'world'此外,正如其他答案所指出的,“全局”命名空间实际上是“对模块是全局的”,而不是“对所有模块都是全局的”。通过导入模块,然后设置相应的属性:import imptee; imptee.foo = "bar",可以更改其他模块中的全局变量。
https://stackoverflow.com/questions/10963813
复制相似问题