最善の (そして最速の) 方法は、簡単な方法で変数の名前を変更することです。しかし、あなたが主張するなら、これで名前の競合を回避できます:
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。キーワードの場合と同様です。