[解決済み】なぜpythonのネストされた関数はクロージャと呼ばれないのですか?
2022-04-15 21:57:05
質問
Pythonでネストされた関数を見たことも使ったこともありますが、クロージャの定義に合致しています。 では、なぜ
nested functions
ではなく
closures
?
ネストされた関数は外部で使用されないのでクロージャではないのでしょうか?
UPDATEです。 クロージャについて読んでいて、Pythonに関するこの概念について考えるようになりました。検索したところ、下のコメントでどなたかが紹介されている記事を見つけましたが、その記事の説明を完全に理解できなかったので、この質問をさせていただきました。
どのように解決するのですか?
クロージャは、関数が実行を終了したスコープからローカル変数にアクセスできるようになったときに発生します。
def make_printer(msg):
def printer():
print(msg)
return printer
printer = make_printer('Foo!')
printer()
いつ
make_printer
が呼び出されると、新しいフレームがスタックに置かれ、その中に
printer
関数を定数とし
msg
をローカルとして使用します。そして、その関数を生成して返す。なぜなら、関数
printer
を参照しています。
msg
変数がある場合、それは
make_printer
関数が返される。
そのため、ネストした関数が
- は、包含するスコープにローカルな変数にアクセスします。
- そのスコープの外側で実行されたときにそうする。
であれば、クロージャではありません。
クロージャではないネストされた関数の例です。
def make_printer(msg):
def printer(msg=msg):
print(msg)
return printer
printer = make_printer("Foo!")
printer() #Output: Foo!
ここでは、パラメータのデフォルト値に値をバインドしています。この現象は、関数
printer
が作成されるので、その値への参照はありません。
msg
の外部にある
printer
の後に維持する必要があります。
make_printer
を返します。
msg
は単なる関数の通常のローカル変数です。
printer
というように、この文脈では
関連
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み】PythonでIoC / DIが一般的でないのはなぜ?
-
[解決済み】JavaScriptのクロージャと無名関数の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python関数の高度な応用を解説
-
python call matlab メソッドの詳細
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Pythonショートビデオクローラーチュートリアル
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] Pythonの関数内の静的変数に相当するものは何ですか?
-
[解決済み] Python非局所文