Pythonの変数のスコープ、クロージャ

質問を見てください:

  これはグローバル宣言変数1 fucn2使用されていますが、変数の値を変更しなかったが、次のコードの出力は、他の言葉では、0であります

デフはfunc1():
    変数1 = 0 
    DEF関数func2():
        グローバル変数1の
        変数1 = 2 
    関数func2()
    プリント(変数1)
__name場合__ == "__ MAIN__":
    関数func1() 
下面这段代码也是输出0 
変数1 = 0 
DEF関数func1( ):
    変数1 = 0 
    DEF関数func2():
        グローバル変数1の
        変数1 = 2 
    関数func2()
    プリント(変数1)
__name場合__ == "__ MAIN__" 
    関数func1()

  以下のコードの出力は、図2に示すように、グローバルの関数です。

変数1 = 0 
DEF関数func1(): 変数1 = 0 
    DEF関数func2():
        グローバル変数1の
        変数1 = 2 
    関数func2()
    プリント(変数1)
__name場合__ == "__ MAIN__":
    関数func1()

  

関連する知識の変数のスコープ:

 

参考リンク:https://www.jianshu.com/p/3bb277c2935c

    Pythonの変数のスコープカテゴリ:

  4の合計のpython変数スコープ

  • ローカルスコープ(L:ローカル)

ローカル変数が定義されており、機能変数内で使用されている、それは関数内でのみ有効です。もはやローカル変数にアクセスすることはできません機能を去った後、それ以外のインタプリタはNameErrorエラーがスローされます。

  • 外装関数functionを閉じる(E:エンクロージング)

パッケージを閉じ定義:内部機能、(ないグローバルスコープではなく)外側の関数の変数が参照されている場合、内部関数はクロージャであると考えられる(閉鎖)

  • グローバルスコープ(G:グローバル)

ローカル変数およびグローバル変数に対応する変数であり、内部および外部の機能に作用することができることを意味する各機能は、各関数内で使用することができる外、すなわち、グローバル変数を使用することができます。

次の2つの方法の定義:試験管内の関数定義された変数には、グローバル変数がなければなりません。変数は、生体内でグローバル関数で定義されています。グローバル変数の使用は、キーワードを変更することができた後、変数はグローバル変数になります。

  • 構築されたスコープ(B:内蔵)

 

変数のスコープのいくつかのルール

  変数の異なる変数のスコープを見つけるために

L - > E - > G - > B  ルールがそれを見つける:ローカルで見つからない、それは地元の局所(例えば、閉鎖)を見つけるために外に行くだろう、あなたは、グローバルを見つけるために見つけることができませんビルトインの外観に加えてインチ

  Pythonのキーワードの競合には命名変数はありませんが、そのような状況があり、重複可変ドメインの役割

>>> STR(2)
'2' 
>>> STR = 5 
>>> strの
5 
>>> STR(2)
トレースバック(最新の呼び出しの最後):
  内のファイル"<STDIN>"、行1、<モジュール> 
TypeError例外:「int型のオブジェクトは、呼び出すことはできません
>>>

  

  また、この検索シーケンスはまた別の問題をもたらす可能性があります。グローバル変数とローカル変数シャドーイング現象を(ときに、同じ名前自分自身)

  デフォルトのグローバル変数は、すべての機能にアクセスするが、変数の定義と同じ名前の関数のグローバル変数場合、ローカル変数は、グローバル変数ケースシールド(非表示)が発生することができます

1 = VARの
DEFのファン():
    印刷するvar 
    VAR = 200である
プリントファン()

#1 file2.pyの
VAR 1 = 
DEFファン()
    。VAR = VARの+ 1人の
    戻りVaRの
印刷ファン()
#UnboundLocalError所与の両方の関数:ローカル譲渡の前に、参照変数「VAR」

  内部に、インタプリタ関数はVAR再割り当てすること、および検出したので、それはローカル変数varとなっている、しかし、彼らが割り当てられるまで、VARを使用していたが、このエラーが表示されます。ソリューションは、内部機能を追加することです  globals var が、関数グローバルVARを実行した後に変更されます。

 

  Pythonは、コードセグメントを変更することができるような可変範囲DEF、クラス、ラムダその他である:  if/elif/else/ try/except for/whileその範囲を変更しません。その内の変数の定義、およびまだ外へのアクセス権を持っています。

:>>> trueの場合
... = A 'I AM A' 
... 
>>> A 
'I AM A' これで、外部またはアクセス言語で定義された変数の場合。
ラップDEF /クラス/ラムダである場合ならばということ#しかし、注意して割り当ての内側に、それはローカルスコープ機能/クラス/ラムダさんになります。

  で  def/class/lambda割り当て内の行動、それはそのローカルスコープになり、ローカルスコープはグローバルスコープを上書きしますが、グローバルスコープには影響しません。

 

クロージャ

  

  パッケージを閉じ定義:内部機能、(ないグローバルスコープではなく)外側の関数の変数が参照されている場合、内部関数はクロージャであると考えられる(閉鎖)

  問題の始まりでは、関数func2の関数func1の変数1を訪問することは閉鎖され、AはPython 3には、キーワードがあるnonlocal。この問題を解決することができますが、変数の閉鎖を変更したり、Python2しようとしませんが。

デフはfunc1():
    変数1 = 0 
    DEF関数func2():
        非ローカル変数1の#の这样就好了
        変数1 = 2 
    関数func2()
    プリント(変数1)
__name場合__ == "__ MAIN__":
    関数func1()

 

  そこにピット閉鎖について:

ラップからのインポートをfunctools 

(ログ)DEFのwarpper:
    DEF外部(F):
        @wraps(F.)
        DEF内部(**キロワット):
            falseの場合:
                = '変更された'ログ
            を印刷ログ
        リターン内部を
    外部返す

@wrapperを( 'ファースト')
ABC DEF():
    渡し

)(プリントABCの
定義で参照する前に:#はnameerror表示されます

  その理由は、検出するインタプリタということでif False、再割り当てを可変の検索規則に従って、それは変数を探しに外部関数(囲む)の閉鎖を行くことはありませんが、そう、if Flaseそう、(その割り当てが定義されていない何も実行しないであろうログ)を保持しませんが実行されていませんこのエラーが発生します。あなたは、必要がない限り、else: log='var'またはif Trueそのような文は、ロジックを追加するには意味がありません(理由はポイントではありませんでした?) だから、変数の閉鎖を変更しないようにしよう

  

可変範囲の指定した範囲を取得します

  参考リンク:http://c.biancheng.net/view/2259.html

  かどうか、グローバル変数の数は、ローカルスケール関数に変数の各変数「ホールド」の値が存在してもよいです。このような観点から、それがローカルまたはグローバルスコープの範囲であるかどうか、これらの変数とその値変数名は辞書のキーで辞書では「見えない」として、変数の値はディクショナリ値です。実際には、Pythonは 以下の3つのツールは、「指定された範囲内の変数辞書を取得する機能を提供します」:

  1. グローバル():この関数は、グローバル構図すべての変数を返す「変数辞書。」
  2. 地元の人々():この関数は、組成物の範囲内のすべてのローカル変数の現在の返す「変数の辞書を。」
  3. VARS(オブジェクト):すべての変数からなる指定された目標範囲内「変数辞書」が取得します。パラメータなし渡すオブジェクト、アクションVARS()の場合や地元の人々についての()と同じです。

  

  グローバル()や地元の人々は、()完全に異なるようだが、彼らは実際には、リンクされている次の2点にこの2つの関数とリンクとの差に:

  • 地元の人々()地元の人々()関数を呼び出して、グローバル(関数の外)、また、以下からなるすべての変数のグローバルスコープで」変数を取得しますので、もし常に、すべての変数は、からなる現在のローカルスコープに「タグ辞典」を取得辞書;変数辞書「とグローバル()どこの実行は、常にからなるすべての変数のグローバルスコープを取得します」 "。
  • 一般的に、地元()およびグローバル()「を変数辞書」のみアクセスされるべきであるを取得し使用して、それが修正されるべきではありません。しかし、実際には、それは(グローバルを使用して)または)(地元の人々を使用しているかどうかは勝った世界的に取る「変数辞書」、および修正することができ、この変更は、本当にグローバル変数自体に変更されます。しかし、地元の人々が()を買収しますローカルエリア内の「変数辞書」、それは修正、ローカル変数には影響しない場合でも、。

おすすめ

転載: www.cnblogs.com/Gaoqiking/p/11262648.html