5

関数の引数をまったく同じ名前のグローバル変数に割り当てるにはどうすればよいですか?

注:self.myVariable = myVariable関数がクラス内にないため、 実行できません。

次のコードを書くと、「引数がローカルとグローバルの両方です」というエラーが表示されます。

myVar = 1
def myFunction(myVar):
    global myVar

これは不可能ですか?もしそうなら、それは他の言語では珍しいことですか? 私が慣れているJavaから来ましたthis.myVar = myVar

編集変数の名前を変更できることはすでに知っています。それが簡単な方法です。

4

3 に答える 3

7

最善の解決策: コードをリファクタリングします。名前を変更するか、グローバル変数の代わりにオブジェクト プロパティを持つオブジェクトを使用します。

別のハッキーな解決策: グローバル変数 dict を直接変更します。

my_var = 1
def my_function(my_var):
    globals()['my_var'] = my_var
于 2013-07-11T19:12:19.480 に答える
1

最善の (そして最速の) 方法は、簡単な方法で変数の名前を変更することです。しかし、あなたが主張するなら、これで名前の競合を回避できます:

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。キーワードの場合と同様です。

于 2013-07-11T20:01:09.820 に答える