ホームページ  >  記事  >  バックエンド開発  >  Python におけるグローバル空間とローカル空間の定義と使用

Python におけるグローバル空間とローカル空間の定義と使用

王林
王林転載
2023-05-07 16:55:081300ブラウズ

    1. 空間とローカル空間

    1. 名前空間

    名前空間の概念は、変数が可視かどうかを分割して制御するために提案されています。ライフサイクルの長さと同様に、名前空間のスコープはスコープと呼ばれます。
    全データを保存する領域を分割し、辞書に格納します(変数と値はマッピング関係を形成します)。全部で3種類あります。

    組み込み名前空間:
    インタープリターの開始時に作成され、インタープリターの実行が終了するまで、最長のライフ サイクル;
    グローバル名前空間:
    ファイルは実行中に作成され、インタープリタが終了するまで存続します。ライフサイクルは長いです。
    ローカル名前空間:
    内部のローカル変数は次のとおりです。番号が呼び出されるまで作成されず、通話が完了した後に作成されます。リリース、短いライフ サイクル;
    作成と破棄のシーケンス
    作成シーケンス:
    Python インタープリターの起動-> 組み込み名前空間の作成-> グローバル名前空間の作成-> ローカル名前空間の作成
    破棄シーケンス:
    関数呼び出し完了後-> 対応するローカル名前空間データを破棄関数へ -> グローバル名前空間データの破棄 -> 組み込み名空間データの破棄

    2. グローバル変数とローカル変数

    グローバル変数とローカル変数とは:

    ローカル変数は関数内で定義された変数です。ローカル変数はローカル名前空間に配置され、そのスコープは関数内でのみ表示されます。つまり、関数内でのみ使用できます。

    # 在函数中创建的变量就是局部变量
    def func():
       var = '局部变量'
    
    # 局部变量不可以在非对应局部环境中使用
    print(var)  # error, 该变量不存在

    グローバル変数は、関数の外部で定義された変数、またはグローバルを使用して関数の内部で定義された変数です。グローバル変数が配置される名前空間は、グローバル名前空間です。スコープはファイル全体、つまりファイル全体に及びます。グローバル変数はどこでも使用できます。

    # 在全局环境中创建的变量就是全局变量
    var = '全局变量'
    
    def func():
        # 在局部中也可以使用全局变量
        print(var)  # 全局变量
    
    func()

    グローバル変数と同じ名前のローカル変数を使用しないことをお勧めします。同じ名前の場合、グローバル変数はローカル環境で使用できません。

    var = '全局变量'
    
    def func():
        # 先使用了全局变量
        print(var)  # error, 找不到该变量
            # 然后局部变量和全局变量同名,那么新的局部变量就会在局部空间中覆盖了全局变量的一切影响力,这就叫做局部变量修改了全局变量;
        # 这样的话导致在局部空间中无法在使用该全局变量,之前在局部空间中使用的该变量就成为了先调用后定义;导致出错。
        var = '局部变量'
        print(var)
    
    func()
    
    # 但是局部同名变量不会影响到全局变量的值
    print(var)  # 全局变量

    組み込み関数は組み込み名前空間であり、Python に付属する組み込み関数を参照します。

    3. スコープ

    ローカル変数のスコープ: 関数内
    グローバル変数のスコープ:ファイル全体

    4. ライフサイクル

    組み込み変数 -> グローバル変数 -> ローカル変数
    組み込み変数は、Python プログラムの実行中に開始され、Python プログラムが終了するまで解放されません。
    グローバル変数は作成された時点から作成され、プログラムが終了するかクリアされるまで解放されません。
    ローカル変数は作成された時点から作成され、ローカル空間の実行が終了するまで解放されます。はクリアされます;

    5. すべてのローカル関数とキーワードの使用

    Function

    Python におけるグローバル空間とローカル空間の定義と使用

    #globals( )

    グローバル スコープ内のすべてのコンテンツを返します。

    グローバルの場合、
    globals を呼び出した後、印刷前のすべての変数が取得され、辞書、グローバル空間スコープが返されます。

    # 定义一些全局变量
    a, b, c = 1, 2, 3
    
    # 调用globals函数
    res = globals()
    
    # 第一次打印,包含a b c
    print(res)
    '''
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test6.py&#39;, &#39;__cached__&#39;: None, &#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3, &#39;res&#39;: {...}}
    &#39;&#39;&#39;
    
    
    # 再定义一些变量
    d, e, f = 1, 2, 3
    
    # 第二次打印,包含a b c d e f
    print(res)
    &#39;&#39;&#39;
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x000002DBDCA5D198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test6.py&#39;, &#39;__cached__&#39;: None, &#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3, &#39;res&#39;: {...}, &#39;d&#39;: 1, &#39;e&#39;: 2, &#39;f&#39;: 3}
    &#39;&#39;&#39;

    ローカルの場合、## を呼び出します。 #globals

    その後、呼び出し前に使用された変数が取得され、辞書が返され、グローバル空間スコープが返されます。<pre class="brush:py;"># 定义一些全局变量 a, b, c = 1, 2, 3 # 在局部环境中使用globals函数 def func(): res = globals() print(res) # 调用函数 func() &amp;#39;&amp;#39;&amp;#39; 结果:不包含 d e f {&amp;#39;__name__&amp;#39;: &amp;#39;__main__&amp;#39;, &amp;#39;__doc__&amp;#39;: None, &amp;#39;__package__&amp;#39;: None, &amp;#39;__loader__&amp;#39;: &lt;_frozen_importlib_external.SourceFileLoader object at 0x000001E7C287D198&gt;, &amp;#39;__spec__&amp;#39;: None, &amp;#39;__annotations__&amp;#39;: {}, &amp;#39;__builtins__&amp;#39;: &lt;module &amp;#39;builtins&amp;#39; (built-in)&gt;, &amp;#39;__file__&amp;#39;: &amp;#39;E:/0-project/python/mymsr/ceshi/test6.py&amp;#39;, &amp;#39;__cached__&amp;#39;: None, &amp;#39;a&amp;#39;: 1, &amp;#39;b&amp;#39;: 2, &amp;#39;c&amp;#39;: 3, &amp;#39;func&amp;#39;: &lt;function func at 0x000001E7C2772F28&gt;} &amp;#39;&amp;#39;&amp;#39; # 再定义一些全局变量 d, e, f = 4, 5, 6 # 第二次调用函数 func() &amp;#39;&amp;#39;&amp;#39; 结果:包含 d e f {&amp;#39;__name__&amp;#39;: &amp;#39;__main__&amp;#39;, &amp;#39;__doc__&amp;#39;: None, &amp;#39;__package__&amp;#39;: None, &amp;#39;__loader__&amp;#39;: &lt;_frozen_importlib_external.SourceFileLoader object at 0x0000021A3F3DD198&gt;, &amp;#39;__spec__&amp;#39;: None, &amp;#39;__annotations__&amp;#39;: {}, &amp;#39;__builtins__&amp;#39;: &lt;module &amp;#39;builtins&amp;#39; (built-in)&gt;, &amp;#39;__file__&amp;#39;: &amp;#39;E:/0-project/python/mymsr/ceshi/test6.py&amp;#39;, &amp;#39;__cached__&amp;#39;: None, &amp;#39;a&amp;#39;: 1, &amp;#39;b&amp;#39;: 2, &amp;#39;c&amp;#39;: 3, &amp;#39;func&amp;#39;: &lt;function func at 0x0000021A3F2D2F28&gt;, &amp;#39;d&amp;#39;: 4, &amp;#39;e&amp;#39;: 5, &amp;#39;f&amp;#39;: 6} &amp;#39;&amp;#39;&amp;#39;</pre>globals はグローバル変数を動的に作成できます

    dic = globals()
    
    print(dic)  # 返回系统的字典
    &#39;&#39;&#39;
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x0000026F357ED198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test6.py&#39;, &#39;__cached__&#39;: None, &#39;dic&#39;: {...}}
    &#39;&#39;&#39;
    
    
    # 在全局的字典当中,通过添加键值对,自动创建全局变量,对应的键是变量名,对应的值是变量指向的值
    dic[&#39;msr123123123&#39;] = &#39;123456&#39;
    
    print(msr123123123) # 123456
    
    # 查看全局内容
    print(dic)
    &#39;&#39;&#39;
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x00000161D944D198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test6.py&#39;, &#39;__cached__&#39;: None, &#39;dic&#39;: {...}, &#39;msr123123123&#39;: &#39;123456&#39;}
    &#39;&#39;&#39;

    locals()

    現在のスコープのすべての内容を返します。

    グローバルの場合は、locals を呼び出した後、印刷前のすべての変数が取得され、辞書はグローバル空間スコープに返されます;

    # 定义一些全局变量
    a, b, c = 1, 2, 3
    
    # 调用locals函数
    res = locals()
    
    # 第一次打印,包含a b c
    print(res)
    &#39;&#39;&#39;
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test1.py&#39;, &#39;__cached__&#39;: None, &#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3, &#39;res&#39;: {...}}
    &#39;&#39;&#39;
    
    
    # 再定义一些变量
    d, e, f = 1, 2, 3
    
    # 第二次打印,包含a b c d e f
    print(res)
    &#39;&#39;&#39;
    结果:
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x0000018C82A3D198>, &#39;__spec__&#39;: None, &#39;__annotations__&#39;: {}, &#39;__builtins__&#39;: <module &#39;builtins&#39; (built-in)>, &#39;__file__&#39;: &#39;E:/0-project/python/mymsr/ceshi/test1.py&#39;, &#39;__cached__&#39;: None, &#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3, &#39;res&#39;: {...}, &#39;d&#39;: 1, &#39;e&#39;: 2, &#39;f&#39;: 3}
    &#39;&#39;&#39;

    ローカルの場合は、

    locals を呼び出した後

    、呼び出し前のすべての変数、戻り辞書、ローカル空間スコープが取得されます; <pre class="brush:py;"># 定义一些局部变量 def func(): # 局部变量 aa, bb, cc = 11, 22, 33 # 第一遍调用 res = locals() # 第一次打印,包含 aa bb cc print(res) # {&amp;#39;cc&amp;#39;: 33, &amp;#39;bb&amp;#39;: 22, &amp;#39;aa&amp;#39;: 11} # 再定义一些局部变量 dd, ee, ff = 44, 55, 66 # 第二次打印,不包含 dd ee ff print(res) # {&amp;#39;cc&amp;#39;: 33, &amp;#39;bb&amp;#39;: 22, &amp;#39;aa&amp;#39;: 11} # 调用第二遍 res2 = locals() # 打印第一次的调用,包含 dd ee ff print(res) # {&amp;#39;cc&amp;#39;: 33, &amp;#39;bb&amp;#39;: 22, &amp;#39;aa&amp;#39;: 11, &amp;#39;ff&amp;#39;: 66, &amp;#39;ee&amp;#39;: 55, &amp;#39;dd&amp;#39;: 44, &amp;#39;res&amp;#39;: {...}} # 打印第二次的调用,包含 dd ee ff print(res2) # {&amp;#39;cc&amp;#39;: 33, &amp;#39;bb&amp;#39;: 22, &amp;#39;aa&amp;#39;: 11, &amp;#39;ff&amp;#39;: 66, &amp;#39;ee&amp;#39;: 55, &amp;#39;dd&amp;#39;: 44, &amp;#39;res&amp;#39;: {...}} # 调用函数,返回在函数中的局部变量 func()</pre>

    Keywords

    Python におけるグローバル空間とローカル空間の定義と使用#global

    ローカル環境で作成した変数はローカル変数であり、グローバル環境では使用できません。ただし、global を使用して定義された変数は、グローバル環境で使用できるグローバル変数です。

    def func():
        var = &#39;局部变量&#39;
    
        global glvar
        glvar = &#39;全局变量&#39;
    
    # 一定要执行局部环境哟
    func()
    
    # 全局环境中
    print(var)  # error,局部变量不能调用
    # 使用global定义的变量是全局变量
    print(glvar)    # 全局变量

    グローバル変数の値はローカル環境では変更できません。ローカル環境でグローバル変数を変更するには、

    global

    を使用してください。

    var = &#39;全局变量&#39;
    
    def func():
        global var
        var = &#39;局部环境中修改&#39;
    
    func()
    
    print(var)  # 局部环境中修改
    6. 関数のネスト

    非ローカルを学習する前に、関数のネストについての知識を学ぶ必要があります。

    内部関数と外部関数

    関数は互いに入れ子にすることができ、外部関数は外部関数と呼ばれ、内部関数は内部関数と呼ばれます。

    def outer():
        print(&#39;我叫outer,是外函数&#39;)
    
        def inner():
            print(&#39;我叫inner,在outer的里面,是内函数&#39;)
    
        # 在外函数中执行内函数
        inner()
    
    
    # 执行外函数
    outer()
    
    &#39;&#39;&#39;
    结果:
    我叫outer,是外函数
    我叫inner,在outer的里面,是内函数
    &#39;&#39;&#39;

    内部関数を外部関数の外部で直接呼び出すことはできません
    • 外部関数を呼び出した後、内部関数を外部関数の外部で呼び出すことはできません。 function
    • 内部関数は外部関数内でのみ呼び出すことができます
    • 内部関数が外部関数内で呼び出される場合、シーケンスが存在します。 Python には事前読み取りメカニズムがないため、この事前読み取りメカニズムは Python のすべてのシナリオに適用されます。
    # 外层是outer,内层是inner,最里层是smaller,调用smaller里的所有代码
    def outer():
        print(&#39;我叫outer,是最外层函数,是inner和smaller的外函数&#39;)
    
        def inner():
            print(&#39;我叫inner,是outer的内函数,是smaller的外函数&#39;)
    
            def smaller():
                print(&#39;我叫smaller,是outer和inner的内函数&#39;)
    
            # 先在inner中执行smaller
            smaller()
    
        # 然后在outer中执行inner
        inner()
    
    # 最后再执行outer才能执行smaller函数
    outer()
    
    &#39;&#39;&#39;
    结果:
    我叫outer,是最外层函数,是inner和smaller的外函数
    我叫inner,是outer的内函数,是smaller的外函数
    我叫smaller,是outer和inner的内函数
    &#39;&#39;&#39;

    我们在多个函数嵌套的时候要注意,不管外函数还是内函数,都是函数,只要是函数中的变量都是局部变量。
    内涵可以使用外函数的局部变量,外函数不能直接使用内函数的局部变量。

    二、LEGB原则

    LEGB原则就是一个就近找变量原则,依据就近原则,从下往上,从里向外,依次寻找。

    B————Builtin(Python):Python内置模块的命名空间    (内建作用域)
    G————Global(module):函数外部所在的命名空间        (全局作用域)
    E————Enclosing Function Locals:外部嵌套函数的作用域(嵌套作用域)
    L————Local(Function):当前函数内的作用域           (局部作用域)

    Python におけるグローバル空間とローカル空間の定義と使用

    nonlocal

    现在我们正式学习nonlocal关键字,nonlocal的作用是修改当前局部环境中上一层的局部变量。那么我们根据这个作用便知道了nonlocal的使用环境至少是一个二级的嵌套环境,且外层的局部环境中必须存在一个局部变量。

    def outer():
        # 定义变量
        lvar = &#39;outer var&#39;
    
        def inner():
            # 内函数使用nonlocal修改上一层的局部变量
            nonlocal lvar
            lvar = &#39;inner var&#39;
    
        # 执行inner函数
        inner()
        print(lvar)
    
    outer() # inner var

    假如上一层的局部环境中没有这个变量怎么办,那么就根据LEGB原则向上寻找。

    def outer():
        # 定义变量
        lvar = &#39;outer var&#39;
    
        def inner():
            
            def smaller():
                
                # smaller中修改变量,但是inner中没有,就向上寻找修改outer中的变量
                nonlocal lvar
                lvar = &#39;smaller var&#39;
    
            # 执行 smaller函数
            smaller()
    
        # 执行inner函数
        inner()
        print(lvar)
    
    # 执行outer函数
    outer()

    如果层层寻找,直到最外层的函数中也没有这个变量,那么就会报错,因为nonlocal只会修改局部变量,如果超出范围,就会报错。

    var = 1  # 变量在最外层的函数之外,也就是全局变量,nonlocal无法修改
    
    def outer():
    
       def inner():
    
          def smaller():
    
             nonlocal var    # error,没有局部变量
             var = 2
             print(var)
    
          smaller()
    
       inner()
    
    outer()

    三、总结

    全局变量和局部变量

    局部环境中可以调用全局变量,但是不能修改(但是如果全局变量是可变数据则可以修改其中的值)
    全局环境中不能调用局部变量 也不能修改

    函数
    global()
    (在函数内部使用,可以对全局变量进行操作)

    • 1、可以在局部环境中定义全局变量

    • 2、可以在局部环境中修改全局变量

    nonlocal()
    (在内函数中使用,可以在内函数中修改外函数中的局部变量)

    关键字:

    locals
    1、locals获取当前作用域当中所有的变量
    如果在全局调用locals之后,获取的是打印之前的所有变量,返回字典,全局作用域
    如果在局部调用loclas之后,获取的是调用之前的所有变量,返回字典,局部作用域

    globals
    2、globals只获取全局空间中的所有变量
    如果在全局调用globals之后,获取的是打印之前的所用变量,返回字典,全局作用域
    如果在局部调用globals之后,获取的是调用之前的所用变量,返回字典,全局作用域

    以上がPython におけるグローバル空間とローカル空間の定義と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。