sys._getframe().f_builtins
と__builtins__.__dict__
の値にはどのような違いがありますか?彼らは常に同じ価値を持ちますか、つまり同じ組み込みオブジェクトですか?
はい。
Pythonの組み込みの名前は、スコープと名前空間で同じままです。だからこそ彼らは"builtins"と呼ばれるのです;インタプリタに組み込まれているのでどこからでもアクセスできます。組み込みマッピングを明示的に変更しない限り、それらは同じになります。
しかし、それだけではなく、両方とも同じビルトインマッピングを指しています。つまり、__builtins__.__dict__
の変更はsys._get_frame().f_builtins
に変更され、その逆も同様です。
また、これは単純な例でテストすることができます。私たちはframe.f_builtins
に新しい組み込み名を追加
>>> import sys
>>> frame = sys._getframe()
>>>
>>> frame.f_builtins == __builtins__.__dict__
True
>>> frame.f_builtins['abc'] = 3
>>> frame.f_builtins['abc']
3
>>> frame.f_builtins == __builtins__.__dict__
True
>>>
すると、__builtins__.__dict__
も変更しました。
注: はCPythonの実装の詳細であり、他のPython実装には存在しない可能性があります。だからそれに頼らないでください。代わりに、builtins
モジュールを使用してください。
ありがとうございました。 'frame.f_builtins == __builtins __.__ dict__'の' == 'は、2つのオペランドが同じオブジェクトにバインドされているかどうか、または2つのオペランドにバインドされているオブジェクトが同じ値/ – Tim
@Tim 'dict'の内容が同じかどうか比較します。同じ内容の2つの辞書オブジェクトを作成し、それらが等しいかどうかを確認することで、これを試すことができます。 –