[解決済み] Pythonヘルパー関数のスコープ
質問
つまり、入力が少し変わるだけで、基本的に同じことをするものがたくさんあるのです。これは、関数化され、異なるパラメータで毎回呼び出される完璧な候補ですよね?
どうやら、pythonは私が間違っていると考えているようです。
そこで、私の問題を煮詰めてみると、次のようになります。
def main():
x = 10
def helper(n):
if (x > n):
x -= n
ヘルパー関数には他にも何十行もあり、メインでも何十回も呼び出されていますが、問題を引き起こしているのはこの行です。ヘルパー関数がmainのスコープを使わずにローカルスコープを使っているのは分かっているのですが、なぜなのか、どうすれば修正できるのか、というのが質問です。
xをグローバルにしたいわけではなく、ヘルパーが自分で作るのではなく、すでにあるxを使いたいだけなのです。このヘルパー関数がなければ、コードの総行数は少なくとも4倍になり、コードは複雑で読みにくい混乱したものになるでしょう。
EDIT: あと、Mainはxを大量に使うから、ローカルで定義するわけにはいかないんだ、念のため。
解決方法は?
Python 3 では、このようなことは
nonlocal x
をインナー関数に追加します。 Python 2ではそれができません。
しかし、その代わりにできることは、ヘルパー関数から値を返し、ヘルパー関数を呼び出す場所にそれを代入することです。 この例からではちょっとわかりにくいですが、次のような使い方をしているのでしょう。
def main():
x = 10
def helper(n):
if (x > n):
x -= n
# do something that changes x
helper(2)
# now x has changed
その代わり、こうしてください。
def helper(x, n):
if (x > n):
return x - n
else:
return x
def main():
x = 10
# do something that changes x
x = helper(x, 2)
# now x has changed
このアイデアは、ヘルパー関数に必要な値を渡し、その結果を返してもらうことで、ヘルパーが呼び出された場所で代入(または好きなように)することができます。 ヘルパー関数が呼び出し元の変数を直接変更するのとは対照的に、 この方法はコードの追跡を容易にします。 また、ここでは
helper
外側
main
となり、両者がよりきれいに分離され、さらに
helper
を他の機能で使用できるようにしました。
関連
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] JavaScriptの変数のスコープとは何ですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
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コードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
任意波形を生成してtxtで保存するためのPython実装
-
PythonによるExcelファイルの一括操作の説明
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり