2

以下が機能しないのはなぜですか。

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'

最初の割り当ては機能しませんが、2 番目の割り当ては機能します。ps1 と sys.ps1 の両方の id() は同じなので、同じものを参照する必要がありますよね?

4

2 に答える 2

3

短いバージョンは次のとおりです。割り当ては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

于 2013-04-19T22:00:37.570 に答える