为什么以下不起作用:
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()都是一样的,所以它们应该引用相同的东西,对吗?
答案 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。