短いバージョンは次のとおりです。割り当てはPythonでは何も変更しません。名前を再バインドするだけです。現在同じ文字列への参照にバインドされている別の名前を再バインドしても、何のsys.ps1影響もありませんsys.ps1。
順を追って説明しましょう。
from sys import ps1
これはインポートしsys(ただし、現在のグローバルに名前をバインドしませんsys)、現在のグローバルの名前をのps1と同じオブジェクトにバインドします。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 '
あなたの2番目は次のようなものです:
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.ps1ps1これらは同じオブジェクトを参照する 2 つの異なる名前であるため、同じ IDを持っています。
そして変えsys.ps1ても変わらないps1。