简短的版本是:赋值不会改变 Python 中的任何内容,它只是重新绑定名称。重新绑定一个不同的名称,该名称恰好当前绑定到对同一字符串的引用,因为sys.ps1
它不会sys.ps1
以任何方式影响。
让我们一步一步来:
from sys import ps1
这会导入sys
(但不绑定sys
当前全局变量中的名称),然后将当前全局变量中的名称绑定到与'sps1
相同的对象。sys
ps1
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
。