首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入到python的导入程序范围中的名称

导入到python的导入程序范围中的名称
EN

Stack Overflow用户
提问于 2012-06-09 19:11:32
回答 3查看 144关注 0票数 2

有两个脚本:

代码语言:javascript
复制
#imptee.py
foo = "abc"

def show():
    print "foo from imptee:",foo

代码语言:javascript
复制
#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名称空间。那么,为什么呢?有人能帮我一下吗?太棒了!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-09 19:20:34

模块有单独的名称空间。当您从一个模块导入另一个模块时,您将从源模块导入值(通常是函数,但在本例中是文字"abc"),并将它们分配给目标模块中的名称。

当您执行from imptee import *时,您将它们分配给与源模块中相同的名称,但这实际上不会更改源模块中的指针。只是重复了名字。

当您在导入之后更改目标模块中的赋值时,这不会改变源模块中的任何内容,因为尽管名称看起来相同,但它们是单独的指针,可以指向不同的事物。

如果您执行import imptee,然后手动分配值:foo = imptee.foo,这可能会更清楚。然后,您将执行foo = 123,在目标模块中foo的值已经更改,但是源模块中同名指针的值却没有变化。

票数 1
EN

Stack Overflow用户

发布于 2012-06-09 19:18:19

Python中所谓的“全局命名空间”实际上是模块名称空间。每个模块都有一个,并且它们是独立的。因此,从*导入imptee会将来自imptee的对象引用复制到__main__中;即使在事实发生之后,imptee仍然有自己的命名空间,show()对此有一个引用。

票数 3
EN

Stack Overflow用户

发布于 2012-06-09 19:16:54

因为语句from imtee import * (大约)与from imptee import foo相同,而后者也(大约)与import imptee; foo = imptee.foo相同。因此,foo不会在imptee中更改,原因是将相同的值分配给两个变量,然后更改其中的一个变量不会改变另一个变量中的值:

代码语言:javascript
复制
>>> a = "hello"
>>> b = a
>>> a
'hello'
>>> b
'hello'
>>> b = 'world'
>>> a
'hello'
>>> b
'world'

此外,正如其他答案所指出的,“全局”命名空间实际上是“对模块是全局的”,而不是“对所有模块都是全局的”。通过导入模块,然后设置相应的属性:import imptee; imptee.foo = "bar",可以更改其他模块中的全局变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10963813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档