teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

修正

2019/05/01 13:08

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -1,4 +1,4 @@
1
- pythonではその記述は、関数の中に関数を定義したとはみなされません。関数の中に関数を定義する文を書いた、とみなされます。
1
+ pythonではその記述は、関数の中に関数を定義したとはみなされません。関数を定義する文ブロックの中に関数を定義する文を書いた、とみなされます。外側はそのまま評価されてグローバル名前空間に`func`が登録されますが、内側は呼び出しのときまで評価されません。
2
2
 
3
3
  要するに、`a = "hoge"`と書いたのと同じで、実行時評価です。外側の関数の実行時までは`func_inner`は存在しませんし、複数回呼べば別々のオブジェクトが生成されます。
4
4
 
@@ -32,6 +32,6 @@
32
32
  """
33
33
  ```
34
34
 
35
- インスタンスの属性などとはまったく違った性質を持つと理解するべきです。`self`は使えません(そもそも構文上受け付ける仕組みがないのだが)。
35
+ インスタンスの属性などとはまったく違った性質を持つと理解するべきです。`self`は使えません(そもそも構文上受け付ける仕組みがないのだが)。原理的に「外側の関数を呼び出さないでアクセスする」方法はありません。
36
36
 
37
37
  グローバル変数に代入するとか、`return`で内側の関数を返して呼び出し側で束縛するとかすれば、「ある呼び出しの時に生成された内側の関数」を捕まえることは可能です。これをうまく利用したクロージャというテクニックもあります。しかし、積極的にそうする理由がなければ、関数内関数を外から呼ぶのは避けたほうが良いです(もっと言えば、関数内関数自体そうめったに必要になるものではない)。