a = 5 def abc(): a += 7 return a def cde(): b = abc() return b print(cde()) ```上記のようなコードを書いたとき local variable 'a' referenced before assignment というエラーが返ってきました。なぜこのコードは成り立たないのでしょうか?またこのコードを成り立たせるためにはどうすればよいのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
python
1a = 5 2def abc(): 3 a += 7 4abc() 5
cde関数は関係なく、上記4行でこのエラーは発生します
local variable 'a' referenced before assignmentとは、
「aという変数が割り当て(宣言)される前に使用(参照)されているぞ」という警告です。
LouiS0616さんが言われているように、簡単な解決は
python
1a = 5 2def abc(): 3 global a 4 a += 7 5abc()
として、a += 7の a は、a = 5の a なんだぞ、と教えてあげる必要があります。
+=を注意する、というお話は・・・
例えば以下の1行だけのpythonプログラムだってエラーです。
a += 5
a = a + 5と書いてもエラーです。
aの値に5を足してaに代入する、といっても、今のaの値がわからないので
明示的な「変数=xx」という変数の宣言が必要だぞ、ということになります。
投稿2018/10/07 11:30
総合スコア39
0
なるほど、面白いもの見つけましたね。まず、下記のだと動くと思います。
python
1a = 5 2def abc(): 3 return a+7 4def cde(): 5 b = abc() 6 return b 7print(cde())
問題になっているのは、abc()
の中ですね。a+=7
はa=a+7
と等価なので、置き換えて考えます。
Python
1def abc(): 2 a = a + 7 # これがlocal変数aの定義式になってしまうのですが・・・ 3 return a
ここで、変数a
への代入式があるので、Pythonがa
を関数abc
のlocal変数だろうと解釈してしまうのですね。ところが、a
自身の定義、つまり右辺式a + 7
にa
が含まれています。つまり、(右辺式の)未定義のa
を使って(左辺式の)a
を定義しようとしてlocal variable 'a' referenced before assignment
が発生したわけですね。
ちょっと苦しい説明ですいません^^;
投稿2018/10/07 11:09
編集2018/10/07 11:12総合スコア3601
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
なぜこのコードは成り立たないのでしょうか?
Python よくある質問 » なぜ変数に値があるのに UnboundLocalError が出るのですか?
またこのコードを成り立たせるためにはどうすればよいのでしょうか?
リンク先のようにglobal文を用いて解決するのが一つの方法です。
が、メンテナンスの観点から、aを引数及び返り値としてやり取りする方が良いと思います。
Python
1a = 5 2 3def abc(arg1): 4 arg1 += 7 5 return arg1 6 7def cde(arg2): 8 b = abc(arg2) 9 return b 10 11print(cde(a)) # 12 12print(a) # 5
この場合グローバル空間の変数aは書き換えられませんので、変数の変化を追いやすいです。
aを書き換えたい場合は、関数の返り値を再代入する形にします。
投稿2018/10/07 09:48
編集2018/10/07 10:38総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/07 10:25 編集
2018/10/07 10:32
2018/10/07 10:38 編集
2018/10/07 10:46
2018/10/07 10:56 編集
2018/10/07 11:28
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。