仕事の今日の内容が完了したので、午後に学習の会社は、クロージャを発生する問題の範囲は必ずしも理解していないと思ったので、彼は(彼は、Javaを取得することであるため)、その後、私の心を理解するのに長い時間をも開発しましたし、私たちを尋ねました私はジンXiaxinが改善勉強するので、他の人は今良好となる、それはすべての人は賢いしているではないと思われます。だから、あなたは心と穏やかが、しっかりと苦しみに切り替えたい場合。
変数閉鎖スコープ
内部機能と、外部の範囲(ただし、グローバルスコープで)変数が参照されているPythonの閉鎖は、内部関数はクロージャであると考えられています
DEF 外側(): X = 8 DEF 内側(Y): 戻り X + Y リターンインナー
以下は、多くの人が見ているべきであるが、時間の私の第一印象で私はそれが3、9、9だと思ったが、プログラムは、その後、長い時間のようにデバッグ実行されて理解するようになりました
デフカウント(): FS = [] のための I における範囲(1,4 ): DEF FN(): リターン i *は、私が fs.append(FN) のリターンのfs F1、F2、F3 = カウント数() プリント(F1() )#9 プリント(F2()) #9 プリント(F3()) #9
それが保存されてFN機能をfsはされているので、i *が返す私私の機能を実行するとき、私のために私の内部ループ、FN関数を呼び出すための外部関数の使用は、私はすでにループは3、FNなり、内部でiは変数を見つけるI = 3、私たちはすべて9です
次のメソッドを使用することができ1,4,9に結果をトップにしたいです:
DEF :()COUNT DEF F(J): DEF G(): 戻り J * Jの リターンG FSを = [] のための I に範囲(1 ,. 4 ): fs.append(F(I)) #F(I)直ちに実行ので、私の現在の値は、F()、アドレスの内容はI G点れる各時間渡される リターンFS F1、F2、F3 = COUNT() プリント(F1()) #1 印刷(F2を( )) #4。 プリント(F3()) #922:40:53であります
次のコードのエラー:UnboundLocalError:ローカル変数「」代入する前に参照さ
= 10 デフバー(): プリント(A) A = ' バー' バール()
Pythonのコンパイル時には、ローカル変数を見つけるために与えられた理由がある=の定義、割り当てなしのようなものです。
最初の文の実行時に、上記の機能バーでは、なぜ、それを関数の本体で代入文がある場合には、Pythonの構文を定義しているグローバル変数を訪問する時間をコンパイルしていないというローカル変数の定義、こうしてカプセル化機能を確保します
二、グローバル
私は、以前のエラーの値がグローバルなキーワードを使用することができますしたくありません
= 10 デフバー(): グローバル 、A = ' バーに' bar()のプリント(a)の#バーで
しかし、そのようなコードの使用は注意する必要があり、彼は簡単にグローバル変数の値を変更することができます
三、非ローカル
クロージャ
DEF FN(): カウント = 8 DEF(DT =インナー0): R =カウント+ dtの プリント(R) #8 リターン内側 FN()()
「」代入する前に参照するローカル変数、および原理は前と同じである:UnboundLocalError:上記のコードは少し変更した場合、彼は上記のエラーを報告します
DEF FN(): カウント = 8 DEF(DT =インナー0): カウント + = DTの 印刷(カウント) を返す内部 (FN)を()#1 会报错
あなたは上記のコードを与えられていないしたい場合は、以下のように、あなたは非ローカルキーワードを使用することができます。
DEF FN(): カウント = 8 DEF内側(DT = 0): カウント非局所 カウント =カウント+ DTの 印刷(カウント) を返す内部 (FN)を() #8
ときなし内部関数ローカル以外のキーワードがその変数を使用し、外部関数は、変数を探すことかもしれません。
しかし、それは非ローカルキーワードの使用は、変数の内部関数は次のように変更されます外側の関数の変数を変更することは注目に値します。
名前= ' グローバル' DEF テスト(): 名 = ' ローカル' DEF inner_test(): ローカル以外の名前の #グローバル名 名 =名+ ' 变量' リターン名の 印刷(名)#'ローカル' + '变量' リターンinner_test() 印刷(名)#'グローバル' の印刷(テスト()) 印刷(名)#'グローバル'
DEF funX(): X = 5 DEFのfuny(): 非局所X X。+ = 1つの 戻りXの リターンfuny A = funX() プリント(()) #6。 印刷(()) #7、X + = 1が既に持っているので。 X外部関数を変化させる。6 プリント(()) #8
だから私は、グローバルとローカル以外以下良い感じ
------シュレーディンガーの塩辛