Python导入和模块范围(特别是sys.ps1)

时间:2013-04-19 21:59:22

标签: python

为什么以下不起作用:

from sys import ps1
ps1 = 'something else '

但是这样做了?

import sys
sys.ps1 = 'something else '

如果我运行简单测试

import sys
from sys import ps1
ps1 = 'something else'
sys.ps1 = 'something else'

第一项任务不起作用,但第二项任务不起作用。 ps1和sys.ps1的id()都是一样的,所以它们应该引用相同的东西,对吗?

2 个答案:

答案 0 :(得分:3)

简短版本是:分配不会改变Python中的任何内容,它只是重新绑定名称。重新绑定一个不同的名称,恰好当前绑定到与sys.ps1相同的字符串的引用,不会以任何方式影响sys.ps1

让我们一步一步:

from sys import ps1

导入sys(但不绑定当前全局变量中的名称sys),然后将当前全局变量中的名称ps1绑定到与{{1}相同的对象} sys

ps1

这会将当前全局变量中的名称ps1 = 'something else ' 重新绑定到与文本ps1相同的对象。没有办法可能影响'something else'模块。

sys

导入import sys ,然后将当前全局变量中的名称sys绑定到它。

sys

这会在当前全局变量中查找名称sys.ps1 = 'something else ' ,获取对sys模块的引用,然后将该模块中的名称sys重新绑定到与文字{相同的对象{ {1}}。


或者,用伪术语表示,而不是用英语......

您的第一个代码示例如下:

ps1

你的第二个是这样的:

'something else '

以下是您在评论中描述的内容的记录。

tempspace._sys = __import__('sys')
globals.ps1 = tempspace._sys.ps1
del tempspace._sys
globals.ps1 = 'something else '

globals.sys = sys_modules.sys = __import__('sys') globals.sys.ps1 = 'something else ' Python 2.7.2 (default, Jun 20 2012, 16:23:33) [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> from sys import ps1 >>> id(sys.ps1) 4360831168 >>> id(ps1) 4360831168 >>> sys.ps1 = 'something else ' something else ps1 '>>> ' something else 具有相同的ID,因为它们是引用同一对象的两个不同的名称。

更改sys.ps1不会更改ps1

答案 1 :(得分:0)

Python的import语句造成的混乱程度应该让发明者在晚上保持警惕!

这是一个尝试explain import的网页。特别是它描述了:

  • 导入X 导入模块X,并使用 X.name 来引用模块X中定义的 name

  • 来自X import * 导入模块X,但在中创建引用 当前命名空间到X中定义的所有公共对象。您使用 name 来引用在X中定义的 name ,但是X本身未定义,因此 X.name 不起作用。

或许,从X import * 查看的一种方法就好像它将内联的模块X的整个源插入,因此您只需直接使用 name 如果它是内联的,你不能使用X,因为它不再存在。

请注意,从模块或包导入*的做法是frowned upon