最善の (そして最速の) 方法は、簡単な方法で変数の名前を変更することです。しかし、あなたが主張するなら、これで名前の競合を回避できます:
import sys
_global = sys.modules[__name__]
# or _globals = sys.modules[__name__].__dict__
myVar = 1
def myFunction(myVar):
_global.myVar = myVar # or _globals['myVar'] = myVar
print myVar # 1
myFunction(42)
print myVar # 42
説明:
モジュール内では、モジュールの名前 (文字列として) をグローバル変数の値として使用できます__name__
。この名前sys.modules
は、モジュール名を既にロードされているモジュールにマップする辞書を参照します。が実行されている場合myFunction()
、そのモジュールはロードされているため、その時点sys.modules[__name__]
で定義されていたモジュールです。グローバル変数MyVar
もモジュール内で定義されているため、 を使用してアクセスできますsys.modules[__name__].myVar
。(その使用法を Java に似たものにするために、名前を付けることができますがthis
、個人的には Java の方が優れていると思います_global
。)
さらに、モジュールの読み取り専用__dict__
属性はその名前空間 (別名グローバル名前空間) であるため、辞書オブジェクトとして表されるため、sys.modules[__name__].__dict__
それを参照するもう 1 つの有効な方法です。
いずれの場合も、存在しない名前への割り当てが行われると、新しいグローバル変数が作成されることに注意してくださいglobal
。キーワードの場合と同様です。