2

有两个脚本:

#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 时,它会产生以下结果:

来自 imptee 的 foo:abc

来自 impter 的 foo:123

来自 imptee 的 foo:abc

我只是不明白为什么在将 123 分配给变量 foo 后,show() 仍然打印'abc',而不是 123。我认为在“from imptee import *”之后,foo 和 show() 现在在全局命名空间中,并且有没有本地命名空间。我明白搜索顺序应该是:本地命名空间、全局命名空间、内置名称规范。那么,这是为什么呢?有人可以帮我一把吗?谢谢!

4

3 回答 3

3

Python中所谓的“全局命名空间”其实就是模块命名空间。每个模块都有一个,它们是独立的。因此,导入*from将对象引用imptee复制到; 即使在事后仍然有自己的命名空间,它引用了不管。imptee__main__impteeshow()

于 2012-06-09T19:18:19.947 回答
1

因为该语句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".

于 2012-06-09T19:16:54.947 回答
1

模块有单独的命名空间。当您从一个模块导入到另一个模块时,您正在从源模块导入值(通常是函数,但在这种情况下是文字“abc”)并将它们分配给目标模块中的名称。

当您这样做时from imptee import *,您将它们分配给它们在源模块中的相同名称,但这实际上并没有改变源模块中的指针。它只是重复名称。

当您在导入后更改目标模块中的分配时,这不会更改源模块中的任何内容,因为即使名称看起来相同,它们也是单独的指针并且可以指向单独的事物。

import imptee如果您这样做然后手动分配值,这可能会更清楚: foo = imptee.foo。然后你会做foo = 123,目标模块中 foo 的值已经改变但源模块中类似名称的指针的值没有改变是有意义的。

于 2012-06-09T19:20:34.840 回答