なぜこれが無限ループに陥らないのですか?

Prashanth Ravichandar

このコードは、このスレッドの回答から取得されました。__name__ == "__main __"の場合はどうなりますか?

# Suppose this is foo3.py.

def functionA():
    print("a1")
    from foo3 import functionB
    print("a2")
    functionB()
    print("a3")

def functionB():
    print("b")

print("t1")
print("m1")
functionA()
print("m2")
print("t2")

(メインのpython3のfoo3.pyとして実行される場合)、私は次のようにコードが実行されると思う:
1.プリントT1
2.プリントM1
3. A1関数Aと印刷開始
こうして再びfoo3を実行して、foo3 4からインポート関数Bを。手順1に戻り
ます。分析を修正するのを手伝ってもらえますか?

アンティハーパラ

foo3再度実行」するのではなくfoo3.pyスクリプトを再度実行します。最初foo3.pyに実行されたのはモジュールを作成すること__main__であり、2回目はモジュールを作成することfoo3.pyでした。

動作は(ほとんど)実際にあるかのようにあなたが名前のファイルを持っていた__main__.pyし、別の名前のfoo3.py 両方のこれらのまったく同じ内容で、あなたはその後、実行しますpython __main__.pyこれが起こっていることです。

ただ、Pythonはそれを偽造して、実際のP​​ythonファイルが何であるかに関係なく名前が付けられたスクリプトからプログラムが開始された __main__.pyかのように見せます。反対の唯一の明白な兆候__file__は、実際のスクリプトのファイル名、つまりを伝えること/spam/ham/eggs/foo3.pyです。


無限ループにならない理由はimport、で指定された名前のモジュールを探すためです。モジュールsys.modulesがすでに存在する場合は、新しいファイルは実行されません。起動時に、Pythonは__main__inのエントリを作成しsys.modules、起動スクリプト(foo3.py)のコードはこのモジュールのスコープ内で実行されます。

次に、ステートメントを実行するときに、にエントリがあるimport foo3かどうかを確認foo3sys.modulesます。そこにないため、という名前の新しい空のモジュールfoo3が作成され、に配置されsys.modules、のコードfoo3.pyがこの新しい空のモジュールのスコープ内で実行されます

最終的にimport 2回目に実行されます。今回 foo3sys.modulesあるので、インポートしてもスクリプトは作成またはロードされず、すでにロードされているモジュールが返されるだけです。

「無限」ループを取得するには、再度sys.moduleインポートfoo3する前に、インポート済みのモジュール参照を削除ます

import sys

def functionA():
    print("a1")

    if 'foo3' in sys.modules:
        del sys.modules['foo3']

    from foo3 import functionB
    print("a2")
    functionB()
    print("a3")

def functionB():
    print("b")

print("t1")
print("m1")
functionA()
print("m2")
print("t2")

そして実行すると、

  [....]
  File ".../foo3.py", line 7, in functionA
    from foo3 import functionB
  File ".../foo3.py", line 17, in <module>
    functionA()
  File ".../foo3.py", line 7, in functionA
    from foo3 import functionB
RuntimeError: maximum recursion depth exceeded while calling a Python object

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

なぜこれが無限ループに陥るのですか?

分類Dev

このソリューションが無限ループに陥らないのはなぜですか?

分類Dev

なぜbreaking-retain-cycleはこのように無限ループに陥らないのでしょうか?

分類Dev

このbashプログラムが無限ループに陥るのはなぜですか?

分類Dev

このコードが無限ループに陥るのはなぜですか?

分類Dev

リーダーが無限ループに陥っているのはなぜですか

分類Dev

なぜこれが無限ループなのですか?

分類Dev

Python、なぜi = + 1が無限ループにならないのですか?

分類Dev

なぜこれが無限ループになるのですか?

分類Dev

なぜこれが無限ループ[SICP]になるのですか?

分類Dev

なぜこれが無限にループするのですか?

分類Dev

keras LSTMモデルが無限ループに陥るのはなぜですか?

分類Dev

なぜこのプロローグルールは無限ループに入らないのですか?

分類Dev

なぜこれがC ++の無限ループなのですか?

分類Dev

これがwhileループで無限ループになるのはなぜですか?

分類Dev

これがwhileループによって無限ループが発生するのはなぜですか?

分類Dev

for内で、これから無限ループが発生するのはなぜですか?

分類Dev

「無限」のforループが処理されないのはなぜですか?

分類Dev

getchar()で入力を取得すると、無限ループに陥るのはなぜですか?

分類Dev

JavaScript無限ループのヘルプ?なぜそれが起こっているのですか?

分類Dev

この場合、useEffectが無限ループにヒットしないのはなぜですか?

分類Dev

このjavascriptループが無限に戻るのはなぜですか?

分類Dev

関数を呼び出した後、なぜ無限ループに陥るのですか?

分類Dev

このgithubプロジェクトを使用しようとすると、無限ループに陥るのはなぜですか?

分類Dev

ここでforループが無限ループになるのはなぜですか?

分類Dev

なぜこのループはcで無限に実行されているのですか?

分類Dev

なぜこれが無限ループなのか

分類Dev

無限のwhileループから抜け出す、なぜこのコードが機能しないのか

分類Dev

「セマフォの更新」でソナーランナー分析が無限ループに陥るのはなぜですか

Related 関連記事

  1. 1

    なぜこれが無限ループに陥るのですか?

  2. 2

    このソリューションが無限ループに陥らないのはなぜですか?

  3. 3

    なぜbreaking-retain-cycleはこのように無限ループに陥らないのでしょうか?

  4. 4

    このbashプログラムが無限ループに陥るのはなぜですか?

  5. 5

    このコードが無限ループに陥るのはなぜですか?

  6. 6

    リーダーが無限ループに陥っているのはなぜですか

  7. 7

    なぜこれが無限ループなのですか?

  8. 8

    Python、なぜi = + 1が無限ループにならないのですか?

  9. 9

    なぜこれが無限ループになるのですか?

  10. 10

    なぜこれが無限ループ[SICP]になるのですか?

  11. 11

    なぜこれが無限にループするのですか?

  12. 12

    keras LSTMモデルが無限ループに陥るのはなぜですか?

  13. 13

    なぜこのプロローグルールは無限ループに入らないのですか?

  14. 14

    なぜこれがC ++の無限ループなのですか?

  15. 15

    これがwhileループで無限ループになるのはなぜですか?

  16. 16

    これがwhileループによって無限ループが発生するのはなぜですか?

  17. 17

    for内で、これから無限ループが発生するのはなぜですか?

  18. 18

    「無限」のforループが処理されないのはなぜですか?

  19. 19

    getchar()で入力を取得すると、無限ループに陥るのはなぜですか?

  20. 20

    JavaScript無限ループのヘルプ?なぜそれが起こっているのですか?

  21. 21

    この場合、useEffectが無限ループにヒットしないのはなぜですか?

  22. 22

    このjavascriptループが無限に戻るのはなぜですか?

  23. 23

    関数を呼び出した後、なぜ無限ループに陥るのですか?

  24. 24

    このgithubプロジェクトを使用しようとすると、無限ループに陥るのはなぜですか?

  25. 25

    ここでforループが無限ループになるのはなぜですか?

  26. 26

    なぜこのループはcで無限に実行されているのですか?

  27. 27

    なぜこれが無限ループなのか

  28. 28

    無限のwhileループから抜け出す、なぜこのコードが機能しないのか

  29. 29

    「セマフォの更新」でソナーランナー分析が無限ループに陥るのはなぜですか

ホットタグ

アーカイブ