- ベストアンサー
パイソンのエラーの原因と対処法を教えて下さい。
- パイソンのプログラムを組んだ際にエラーが発生しました。エラーの原因と修正法について教えてください。
- プログラムの内容は、生成した乱数が素数か否か判定し、素数でなかった場合は0を、素数ならば1/(試行回数)を足し合わせる試行の中で、素数が出た回数を表示するものです。
- プログラムが完成した場合、CPUを多くの回数試行させて、1から1000000000000000000までの数の中に含まれる素数の個数を推測することが目標ですが、エラーが発生しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
グローバル変数のint_aを関数内で変更したい場合は、変更する箇所より前に global int_a とint_aがグローバル変数であることを宣言してください。そうしないと、新しくローカル変数として作成されてしまいます。(グローバル変数を参照するだけで変更しない場合は、宣言は必要ないため、ここで引っかかる人が多いです。)
その他の回答 (2)
- wormhole
- ベストアンサー率28% (1626/5665)
>UnboundLocalError: local variable ‘int_a‘ referenced before assignment >と出てきてしまいます。どうしたらいいですか。 「 local variable ‘int_a‘ referenced before assignment」を訳してみましたか?
お礼
お礼が遅れた申し訳ありません。 回答ありがとうございました。
補足
「ローカル変数の ‘int_a‘ が指定される前に言及された」と解釈し、 ローカル変数は関数ブロック内でしか使えないから、 def sosuu_kuzi(): a=‘‘0‘‘ int_a=int(a) という形に切り替え、最後の段落のint_aを取り除いたんですが、 今度はエラーメッセージすら表示されなくなってしまいました。
- wormhole
- ベストアンサー率28% (1626/5665)
>def sosuu_kuzi(): >for sosuu_kuzi in range(num_num): 関数sosuu_kuziの後で変数sosuu_kuziを定義しているので、変数sosuu_kuziが勝ってます。 関数名と変数名を同じでないようにしてください。
お礼
お礼が遅れた申し訳ありません。 回答ありがとうございました。
補足
回答ありがとうございます。 for sosuu_kuzi() in range(num_num) sosuu_kuzi() ↓ for cnt in range(num_num) sosuu_kuzi() に変更してみたんですが、 UnboundLocalError Traceback (most recent call last) <ipython-input-2-e 267ac 80b 77f> in <module> 13. brake 14 for cnt in range (num_num): →15() sosuu_kuzi() <ipython-input-2-e 267ac 80b 77f> in sosuu_kuzi () 10 break 11 else: →12 int_a += 1%num_num 13 break 14 for cnt in range (num_num): UnboundLocalError: local variable ‘int_a‘ referenced before assignment と出てきてしまいます。どうしたらいいですか。
お礼
お二方ともありがとうございました。 以下のようにしたらとりえずエラーが でなくなりました。 出てくる答えがなんかおかしい気がしますが、 そこら辺はまた自分で調べときます。 global num_num NUM=input("Enterキーを押せ!") num_num = int(NUM) global list_a list_a = [] for cnt in range(num_num): from random import randint a_num = randint(1,100) for num in range(2,a_num): if a_num % num == 0: list_a.append(0) break else: list_a.append(1/num_num) break sum(list_a)*100 Enterキーを押せ!1100 47.000000000000256
補足
回答ありがとうございます。 int_aがグローバル変数であることを宣言したら、 local variable ‘int_a‘ referenced before assignment というエラーメッセージは表示されなくなりましたが、 今度は 'int' object is not iterable というエラーメッセージが出てきてしまいました。 反復不可能なものを反復可能にするための方法が分かりません。 どうしたらいいですか。 以下のように変更しました。 global num_num NUM=input("Enterキーを押せ!") num_num = int(NUM) def sosuu_kuzi(): global int_a a="0" int_a=int(a) from random import randint a_num = randint(1,100) for num in range(2,a_num): if a_num % num == 0: int_a += 0 break else: int_a += 1 / num_num break for cnt in range(num_num): sosuu_kuzi() tanomu = 10*int_a sum_a = sum(tanomu) sum_int_a = int(sum_a) print(sum_int_a) Enterキーを押せ!10 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-91e5d3ec4c6d> in <module> 18 sosuu_kuzi() 19 tanomu = 10*int_a ---> 20 sum_a = sum(tanomu) 21 sum_int_a = int(sum_a) 22 print(sum_int_a) TypeError: 'int' object is not iterable