2

これはtest.pyです:

import sys

a = 50
b = [1,2]

def change():
    print "Here 1"
    import test
    print "Here 2"
    test.a = -1
    test.b = [0,1]
    return

def main():
    print "Here 3"
    change()
    print "Here 4"
    print a, b

if 1:
    main()

上記の python コードをシステムで実行すると、次の出力が生成されます。

Here 3
Here 1
Here 3
Here 1
Here 2
Here 4
-1 [0, 1]
Here 2
Here 4
50 [1, 2]

「Here 1 \n Here 3」出力の無限ループがないのはなぜなのか、私は混乱しています。print a、b 出力はどのように正当化できますか?

4

4 に答える 4

14

ファイルをスクリプトとして実行すると、testモジュールとは見なされません。モジュールと見なされ__main__ます。

実行がヒットimport testすると、ファイルの 2 回目の実行が開始され、モジュールは と見なされますtest

実行が再びヒットimport testすると、Python は既にインポート中であることを認識しtest、モジュールを再実行しません。代わりに、半分だけ初期化testされたモジュール オブジェクトを現在のネームスペースにロードして続行します。Python の楽観的な仮定はtest、インポートが完了するまで の内容が必要にならないようにコードを記述したというものです。

実行が および への割り当てにヒットするtest.aと、モジュールにtest.b影響しますが、同じファイルからのものであるにもかかわらず、 には影響しません。したがって、インポートされたモジュールの from は新しい値を反映し、fromは初期値を反映します。test__main__print a, bprint a, b__main__

于 2014-01-24T06:55:14.450 に答える
0

このスクリプトの一般的な流れは次のとおりです。

  1. メインが実行されているため、「Here 3」が出力されます
  2. change が呼び出されるため、「Here 1」が出力されます
  3. テストをインポートすると、python はテストのメイン関数を実行します
  4. 2 回目に change を呼び出すと、python は test が既にインポートされていることを十分に認識できるので、その行を効果的にスキップします。
  5. インポートされたメインの実行が終了します
  6. 元のスクリプトの実行が終了します。
于 2014-01-24T06:56:06.760 に答える
0

ファイルは 1 回だけインポートできます。'import test' 行は、最初に検出されたときに成功します。2 回目に遭遇すると、インタープリターはそれが既にロードされていることを確認します。

プログラムが最初に実行されるときは、「インポートされた」とは見なされません。

于 2014-01-24T06:54:59.537 に答える