質問は紛らわしいです。これが例です。
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
これは大丈夫ですよね?私は持っている必要はありません:selfを呼び出すためのanother_fun(self)?私は実際にそれをテストしました、そしてそれは働きます。少し不安になるので、説明が必要でした。
質問は紛らわしいです。これが例です。
class some_class():
some_var = 5
def some_fun(self):
def another_fun():
return self.some_var
これは大丈夫ですよね?私は持っている必要はありません:selfを呼び出すためのanother_fun(self)?私は実際にそれをテストしました、そしてそれは働きます。少し不安になるので、説明が必要でした。
another_fun
あなたの場合、それは他の関数にネストされているので必要ありません、それでそれはその関数からローカル名をキャプチャself
します、そしてそれはを含みます。実際には、からアクセス可能な名前は、からsome_fun
もアクセスできますanother_fun
。
これはクロージャと呼ばれるものであり、関数を作成する関数を作成するのは素晴らしいことです。古典的な例は次のとおりです。
def MultiplyBy(x):
def M(y):
return x * y
return M
Double = MultiplyBy(2)
Triple = MultiplyBy(3)
print Double(10), Triple(10)
印刷されます20 30
。
はい、ある関数を別の関数の内部で定義すると、内部の関数は外部の関数から変数を読み取ることができます。これはに固有のものではありませんself
。これは、すべての関数のすべての変数に対して機能します。
>>> def outer():
... a = 2
... def inner():
... print a
... inner()
>>> outer()
2
Python 2では、内部関数で外部変数を再バインドすることはできません(つまり、上記のa = 3
内部で再バインドすることはできませんinner
)。nonlocal
Python 3では、ステートメントを使用してこれを行うことができます。
しかし、なぜあなたはこれをしているのですか?そもそも、上記のコードはを呼び出さないanother_fun
ので、それが行うことは重要ではありません。一般に、他の関数内で関数を定義することは少し奇妙なことです。それを行うための正当なケース(デコレータなど)は確かにありますが、多くの場合、混乱を引き起こす可能性があります。