简短的版本是:赋值不会改变 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。