2

为什么以下不起作用:

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() 是相同的,所以它们应该指的是同一个东西,对吧?

4

2 回答 2

3

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

让我们一步一步来:

from sys import ps1

这会导入sys(但不绑定sys当前全局变量中的名称),然后将当前全局变量中的名称绑定到与'sps1相同的对象。sysps1

ps1 = 'something else '

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

import sys

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

sys.ps1 = 'something else '

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


或者,用伪 Python 术语代替英文……</p>

您的第一个代码示例是这样的:

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并且ps1具有相同的 ID,因为它们是引用同一对象的两个不同名称。

而变sys.ps1不变ps1

于 2013-04-19T22:00:37.570 回答
0

Python 的 import 语句引起的混乱程度应该会让它的发明者彻夜难眠!

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

  • import X导入模块 X 并且您使用X.name来引用模块 X 中定义的名称

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

从 X import *查看的一种方法可能几乎就像它内联插入了模块 X 的整个源代码,因此您只需直接使用name就好像它是内联的,并且您不能使用 X,因为它不再存在。

请注意,从模块或包中导入 * 的做法是不受欢迎的

于 2013-04-19T22:23:57.820 回答