質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

【Python】for内のimportが予想外の動作をするので修正したい

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 270

halzip

score 1

前提・実現したいこと

Pythonで作成中です。
forループの中に別のプログラムを呼び出すためにimportを使用しているのですが、
出力結果が想定外のものになり困っています。

■実現したい出力結果
a
0
b
1
c
2
d
3
e
4
f
5

■実際の出力結果
a
a
b
c
d
e
f
6
b
c
d

該当のソースコード

プログラム名:メイン

hais = ["a","b","c","d","e","f"]
i = 0
for hai in hais:
    print(hai)
    import ループ1
    i = i + 1
プログラム名:ループ1

from メイン import i
print(i)

試したこと

原因の検討もつかず試せておりません…
どなたかご教授いただけませんでしょうか。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2021/01/21 08:33

    あなたはどうなると思ってるんでしょうか。

    キャンセル

  • tomy-c

    2021/01/21 09:37

    他の言語に触られていたのであればそのimportの書き方自体おかしいと直感で察することが出来ると思うのですが、プログラミングの経験はpythonが初めてでしょうか?

    キャンセル

回答 3

checkベストアンサー

+2

一度importされたモジュールは、そのあとのimport文で再度読み込まれません。
ループの中でimportしても、最初の1回目でのみimport(実行)されて、それ以降では何も起こらないです(正確には、全く何も起こらないわけではないです→下記コメント参照)。
なので、通常はループの中でimportするようなことはしないです。

今回の例では、ループ1からメインをimportしているのでちょっと複雑ですが、実際に実行されるのは最初のimportだけということに注意しながら、動きを追ってみると実行結果がそうなるのが理解できると思います。

importlib.reload()を使うと強制的に再度読み込めますが、あまりそういう使い方はしないと思います。

他の方の回答にもありますが、モジュール内では関数やクラスを定義して、それを使うようにするのが一般的です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/21 10:37

    回答ありがとうございます!
    importの特性までご説明いただきありがとうございます。
    おかげ様で理解が深まりました。
    ベストアンサーに選ばせていただきました。

    キャンセル

  • 2021/01/21 11:29

    「それ以降では何も起こらないです」はちょっと正確ではなくて、モジュールの探索と名前の束縛は毎回起こりますよね。そこだけ気になりました。

    キャンセル

  • 2021/01/21 11:41

    quickquipさん、ご指摘ありがとうございます。そのとおりですね。正確さに欠ける表現でした。
    ここらあたりをわかりやすく説明するのが難しかったのでざっくり書いてしまいました。

    キャンセル

+1

importってのはコードを実行させるような命令じゃありません
調べ直してみては。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/21 08:41

    回答ありがとうございます。
    調べたところ↓のように解説しているサイトが複数ありましたので、
    importは他のpyファイルから変数をもってきたり、pyファイル自体を実行するものだと考えていました。
    https://qiita.com/ume1126/items/c1be49cc9ad5553ecc78

    >あなたはどうなると思ってるんでしょうか。
    importについて上記の思考をしていたので「■実現したい出力結果」が出力されるものだと考えていました…

    キャンセル

  • 2021/01/21 08:57

    そのリンク先には、

    外部ファイルの関数を実行するときは、
    まずインポートして
    次に インポートファイル.関数名()
    で実行できます。

    と、ありますね

    キャンセル

+1

pythonで他の.pyプログラムを実行すると用法に相違があるように思われます。下記のように書くと、期待する出力結果が出ると思われますが、いかがでしょうか。

loop.py

def hoge(i):
    print(i)

main.py

from loop import hoge

hais = ["a", "b", "c", "d", "e", "f"]
i = 0
for hai in hais:
    print(hai)
    hoge(i)
    i = i + 1

output

a
0
b
1
c
2
d
3
e
4
f
5

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/21 10:35

    丁寧に教えていただきありがとうございます!
    おかげ様でdefの使い方を理解できました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る