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