累算代入文とは
累算代入文は、二項演算と代入文を組み合わせて一つの文にしたものです
謎
>>> a = 1
>>> a = a + 1
>>> a
2
>>> a = 1
>>> def f():
... b = a + 1
... return b
...
>>> f()
2
>>> a = 1
>>> def f():
... a = a + 1
... return a
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
追記1
>>> a = 1
>>> def f():
... global a
... a = a + 1
... return a
...
>>> f()
2
追記2 謎の解決
なぜ変数に値があるのに UnboundLocalError が出るのですか?
によるとこのように説明されるようです。
これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。
@gotta_dive_into_python さんありがとう
追記3 そして新たな謎へ
「あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになる」ことと、locals()
に登録されていることは同じことかな、などと実験しているうちにまた別の謎が。
>>> def f():
... a = locals()
... return a
...
>>> f()
{}
>>> def f():
... a = locals()
... b = 1
... return a
...
>>> f()
{}
>>> def f():
... a = locals()
... b = locals()
... return a
...
>>> f()
{'a': {...}}