2017-12-05 238 views
0

私のメインクラスでは、config.pyという別のファイルで定義されているグローバル変数ADDRESSを使用します。 config.pyで関数を呼び出すことで、私のメインクラス内からADDRESSの値を変更したいと思います。Python:別のファイルからグローバル変数を変更する

私は私のメインクラスで

:私は、次のしている私の設定ファイルで

from config import ADDRESS, change_address 
change_address("192.168.10.100") 
print("new address " + ADDRESS) 

ADDRESS = "0.0.0.0" 

def change_address(address): 
    global ADDRESS 
    ADDRESS = address 
    print("changed address to: " + ADDRESS) 

私の設定ファイルのprint文は正しく192.168.10.100の新しいアドレスを出力します。 しかし、私のメインクラスのprintステートメントは0.0.0.0を出力します。 私はここで何が欠けていますか?

+0

あなた 'import'はconfigに' ADDRESS'変数が参照する文字列に新しいローカル変数 'ADDRESS'をバインドstackexchangeの記事を読むことをお勧めします。 'change_address()'を呼ぶと、configの 'ADDRESS'変数が別の文字列を参照するようになりました。独自のローカル変数は引き続き元の文字列を参照します。 – quamrana

答えて

3

from config import ADDRESS, change_addressが行うすべてのことは、あなたのconfigモジュールの名前空間からADDRESSchange_addressを取っているし、あなたの現在のモジュールの名前空間にそれをダンプします。今、ADDRESSの値をconfigの名前空間に再割り当てすると、現在のモジュールでは認識されません。これが名前空間の仕組みです。それは次のようなものです:

>>> some_namespace = {'a':1} 
>>> globals().update(some_namespace) 
>>> a 
1 
>>> some_namespace 
{'a': 1} 
>>> some_namespace['a'] = 99 
>>> a 
1 
>>> some_namespace 
{'a': 99} 

もっとも簡単な解決法はありますか?名前空間を壊さないでください:

import config 
config.change_address("192.168.10.100") 
print("new address " + config.ADDRESS) 
+1

あなたはもっと速かった;)このリンクを追加したかったのは、このよくある問題を説明しているからです:https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables -across-modules – gonczor

+0

は完全に働きました:)ありがとう@Gonczor。重複する質問ではありませんが、私はここで同じ解決策を見つけました:https://stackoverflow.com/questions/3536620/how-to-change-a-module-variable-from-another-module – crusarovid

0

モジュール内のグローバル状態を変更しないようにしてください。代わりに、config.pyのADDRESSが変更されないようにコードを書き直します。私はどうしたらメインで次に

ADDRESS = '0.0.0.0' 

def get_default_config(): 
    return {'address': ADDRESS, 'some_other_config_value': 'foo'} 

:アプリケーションの設定が呼び出しに呼び出しから変更することができる場合、私は何かのようにする設定を変更します

app_config = config.get_default_config() 
app_config = "192.168.10.100" 
print("new address " + app_config['address'] 

を原則としてそうではありません他のモジュールの変数/定数の値を変更することをお勧めします。

注:config.addressなどの設定値にアクセスできるように、configクラスも作成できます。

は、私はあなたがWhy is Global State so Evil?

関連する問題