3

メイン モジュールのグローバル値を変更して、プログラム モードを切り替えます。

変更は、そのモジュール内で発生した次の関数呼び出しに反映されますが、他のモジュールが同じ関数を呼び出した場合には反映されません。

関数呼び出しが外部から来るとき、メインモジュールは古い/外部/重複した値を使用していますか?

main_module.py

import second_module

mode = 1

def print_mode():
  print 'Mode: ' + str(mode)

if __name__ == "__main__":
  print_mode()
  mode = 2
  print_mode()
  second_module.problem()

second_module.py

from main_module import print_mode

def problem():
  print_mode()

出力

$ python main_module.py
Mode: 1
Mode: 2
Mode: 1
4

1 に答える 1

2

コマンドラインで指定したファイルは、という名前のモジュールとして実行されます__main__(__name__ == '__main__'条件はこれに依存しています)。通常、モジュールは一度だけインポートされ、その後のインポートでは同じモジュール名への別の参照が与えられます。

ただし、このメカニズムはモジュール名に基づいています。from main_module import print_modeは という名前のモジュールを探しますがmain_module、そのようなモジュールはまだないため、ファイルが再度ロードされ、 という別のモジュールmain_moduleが作成されます。これには からのコードをmain_module.py再度実行する必要があり、これにより が再び初期化されmode = 1ますが、前述の条件に失敗するため、他のことは何もしません ( などmode = 2)。

__main__second_module、 の3 つのモジュールができあがりますmain_module__main__.mode == 2、しかしmain_module.mode == 1、およびsecond_module.print_mode is main_module.print_modeであるため、print_mode呼び出しは 2 をsecond_module参照しmain_module.modeます。

簡単な方法は、ロジックを in に持たないことです__main__。エントリ ポイントを in の関数main()に入れ、次に importと callmain_module.py以外は何もしない別のスクリプトを作成します。または、グローバルを使用しないでください;-)main_modulemain_module.main()

于 2013-05-26T12:08:57.297 に答える