3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【メモ】Pythonの関数内での累算代入文の謎

Last updated at Posted at 2016-12-14

累算代入文とは

累算代入文

累算代入文は、二項演算と代入文を組み合わせて一つの文にしたものです

>>> 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': {...}}
3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?