Python导入和模块作用域(特别是系统ps1)

2024-03-28 08:42:19 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么以下方法不起作用:

from sys import ps1
ps1 = 'something else '

但这是真的吗?在

^{pr2}$

如果我做个简单的测试

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

第一个作业不起作用,但第二个作业有效。ps1和系统ps1是一样的,所以它们应该指同一件事,对吗?在


Tags: 方法fromimport系统sys作业elsesomething
2条回答

Python的import语句引起的混乱程度应该会让它的发明者夜不能寐!在

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

  • 导入X导入模块X,然后使用X.name引用模块X中定义的名称

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

也许,从X import*查看的一种方法是,它几乎插入了模块X的整个源代码,因此您只需直接使用名称,就好像它是内联的一样,而不能使用X,因为它已经不存在了。在

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

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

让我们一步一步来:

from sys import ps1

它导入sys(但不绑定当前全局中的名称sys),然后将当前全局中的名称ps1绑定到与sysps1相同的对象。在

^{pr2}$

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

import sys

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

sys.ps1 = 'something else '

它在当前全局变量中查找名称sys,获得对sys模块的引用,然后将该模块中的名称ps1重新绑定到与文本'something else '相同的对象。在


或者,用伪Python术语代替英语

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

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 

sys.ps1和{}具有相同的ID,因为它们是引用同一对象的两个不同名称。在

而改变sys.ps1不会改变ps1。在

相关问题 更多 >