Definition und Verwendung des globalen Raums und des lokalen Raums in Python

王林
Freigeben: 2023-05-07 16:55:08
nach vorne
1293 Leute haben es durchsucht

    1. Raum und lokaler Raum

    1. Namespace

    Das Konzept des Namespace wurde vorgeschlagen, um zu unterteilen und zu steuern, ob Variablen sichtbar sind und die Länge ihres Lebenszyklus wird als Scope bezeichnet.
    Teilen Sie einen Bereich auf, um alle Daten zu speichern, und speichern Sie sie in einem Wörterbuch (Variablen und Werte bilden eine Zuordnungsbeziehung). Insgesamt gibt es drei Typen.

    Eingebauter Namespace:
    Erstellt, wenn der Interpreter startet, bis zum Ende des Interpreters, der längste Lebenszyklus;
    Globaler Namespace:
    Erstellt, wenn die Datei ausgeführt wird, bis zum Ende des Interpreters längster Lebenszyklus;
    Lokaler Namespace:
    Die darin enthaltenen lokalen Variablen werden nur erstellt, wenn die Nummer angerufen wird, und nach Abschluss des Anrufs freigegeben, mit einem kurzen Lebenszyklus;
    Erstellungs- und Zerstörungsreihenfolge:
    Python-Interpreter startet –> Erstellen Sie einen globalen Namespace –> Erstellen Sie einen lokalen Namespace.
    Nachdem der Funktionsaufruf abgeschlossen ist –> Zerstören Sie die entsprechenden lokalen Namespaces die Funktion -> Zerstöre die globalen Namespace-Daten - > Zerstöre die integrierten Namespace-Daten
    2. Globale Variablen und lokale Variablen:

    Lokale Variablen sind innerhalb der Funktion definierte Variablen . Die lokale Variable befindet sich im lokalen Namensraum. Ihre Funktionsfelder sind nur innerhalb von Funktionen sichtbar, was bedeutet, dass sie nur innerhalb von Funktionen verwendet werden können.

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

    Globale Variablen sind Variablen, die außerhalb der Funktion oder mithilfe von globalen Variablen definiert sind. Der Namespace, in dem sich die globale Variable befindet, erstreckt sich über die gesamte Datei, dh an eine beliebige Stelle in der gesamten Datei verwendet werden kann.

    # 在全局环境中创建的变量就是全局变量
    var = '全局变量'
    
    def func():
        # 在局部中也可以使用全局变量
        print(var)  # 全局变量
    
    func()
    Nach dem Login kopieren
    Es ist am besten, keine lokalen Variablen mit demselben Namen wie globale Variablen zu verwenden. Wenn sie denselben Namen haben, kann die globale Variable nicht in der lokalen Umgebung verwendet werden.
    var = '全局变量'
    
    def func():
        # 先使用了全局变量
        print(var)  # error, 找不到该变量
            # 然后局部变量和全局变量同名,那么新的局部变量就会在局部空间中覆盖了全局变量的一切影响力,这就叫做局部变量修改了全局变量;
        # 这样的话导致在局部空间中无法在使用该全局变量,之前在局部空间中使用的该变量就成为了先调用后定义;导致出错。
        var = '局部变量'
        print(var)
    
    func()
    
    # 但是局部同名变量不会影响到全局变量的值
    print(var)  # 全局变量
    Nach dem Login kopieren

    Eingebaute Funktionen sind integrierte Namespaces, die auf die integrierten Funktionen verweisen, die mit Python geliefert werden.

    3. Geltungsbereich

    Innerhalb der Funktion

    Globaler Variablenbereich:

    über die gesamte Datei

    Eingebaute Variablen-> Lokale Variablen

    Integrierte Variablen beginnen, wenn das Python-Programm ausgeführt wird, und werden erst freigegeben, wenn das Python-Programm endet. Globale Variablen beginnen mit der Erstellung und werden erst freigegeben, wenn das Programm endet oder gelöscht wird lokal Der Speicherplatz wird freigegeben, wenn die Ausführung abgeschlossen oder gelöscht ist.
    Funktion


    globals()

    gibt alle Inhalte im globalen Bereich zurück .

    Wenn es global ist, werden nach dem Aufruf von globals alle Variablen vor dem Drucken abgerufen und das Wörterbuch und der globale Bereich zurückgegeben.

    # 定义一些全局变量
    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;
    Nach dem Login kopieren

    Wenn es lokal ist, werden nach dem Aufruf von < code>globals , ruft die vor dem Aufruf verwendeten Variablen ab, gibt das Wörterbuch und den globalen Bereich zurück.

    # 定义一些全局变量
    a, b, c = 1, 2, 3
    
    
    # 在局部环境中使用globals函数
    def func():
        res = globals()
        print(res)
    
    
    # 调用函数
    func()
    &#39;&#39;&#39;
    结果:不包含 d e f
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x000001E7C287D198>, &#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;func&#39;: <function func at 0x000001E7C2772F28>}
    &#39;&#39;&#39;
    
    
    # 再定义一些全局变量
    d, e, f = 4, 5, 6
    
    # 第二次调用函数
    func()
    &#39;&#39;&#39;
    结果:包含 d e f
    {&#39;__name__&#39;: &#39;__main__&#39;, &#39;__doc__&#39;: None, &#39;__package__&#39;: None, &#39;__loader__&#39;: <_frozen_importlib_external.SourceFileLoader object at 0x0000021A3F3DD198>, &#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;func&#39;: <function func at 0x0000021A3F2D2F28>, &#39;d&#39;: 4, &#39;e&#39;: 5, &#39;f&#39;: 6}
    &#39;&#39;&#39;
    Nach dem Login kopieren
    globals kann dynamisch globale Variablen erstellen aktuellen Umfang.

    Wenn es global ist, erhalten Sie nach dem Aufruf von locals alle Variablen vor dem Drucken, Rückgabewörterbuch und globalen Leerzeichenbereich.

    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;
    Nach dem Login kopieren
    Definition und Verwendung des globalen Raums und des lokalen Raums in PythonWenn es lokal ist, erhalten Sie nach dem Aufruf von locals alle Variablen vor dem Aufruf Alle Variablen, Rückgabewörterbuch, lokaler Leerzeichenbereich; " alt ="Was sind globaler und lokaler Raum in Python?" />

    global

    In der lokalen Umgebung erstellte Variablen sind lokale Variablen und können nicht in der globalen Umgebung verwendet werden. Eine mit global definierte Variable ist jedoch eine globale Variable, die in der globalen Umgebung verwendet werden kann.

    # 定义一些全局变量
    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;
    Nach dem Login kopieren
    globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;

    # 定义一些局部变量
    def func():
       # 局部变量
       aa, bb, cc = 11, 22, 33
    
       # 第一遍调用
       res = locals()
    
       # 第一次打印,包含 aa bb cc
       print(res)  # {&#39;cc&#39;: 33, &#39;bb&#39;: 22, &#39;aa&#39;: 11}
    
       # 再定义一些局部变量
       dd, ee, ff = 44, 55, 66
    
       # 第二次打印,不包含 dd ee ff
       print(res)  # {&#39;cc&#39;: 33, &#39;bb&#39;: 22, &#39;aa&#39;: 11}
    
       # 调用第二遍
       res2 = locals()
    
       # 打印第一次的调用,包含 dd ee ff
       print(res)  # {&#39;cc&#39;: 33, &#39;bb&#39;: 22, &#39;aa&#39;: 11, &#39;ff&#39;: 66, &#39;ee&#39;: 55, &#39;dd&#39;: 44, &#39;res&#39;: {...}}
       
       # 打印第二次的调用,包含 dd ee ff
       print(res2) # {&#39;cc&#39;: 33, &#39;bb&#39;: 22, &#39;aa&#39;: 11, &#39;ff&#39;: 66, &#39;ee&#39;: 55, &#39;dd&#39;: 44, &#39;res&#39;: {...}}
    
    # 调用函数,返回在函数中的局部变量
    func()
    Nach dem Login kopieren

    如果在局部,调用globals之后,获取的是调用之前的所用变量,返回字典,全局空间作用域;

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

    globals可以动态创建全局变量

    var = &#39;全局变量&#39;
    
    def func():
        global var
        var = &#39;局部环境中修改&#39;
    
    func()
    
    print(var)  # 局部环境中修改
    Nach dem Login kopieren

    locals()

    返回当前所在作用域的所有内容。
    如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;

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

    如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域;

    # 外层是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;
    Nach dem Login kopieren
    Nach dem Login kopieren

    关键字

    Definition und Verwendung des globalen Raums und des lokalen Raums in Python

    global

    在局部环境中创建的变量是局部变量,在全局环境中是不可以使用的。但是使用global定义的变量就是一个全局变量,这个变量可以全局环境中使用。

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

    在局部环境中无法修改全局变量的值,使用globalDer Wert globaler Variablen kann in der lokalen Umgebung nicht geändert werden. Verwenden Sie global, um globale Variablen in der lokalen Umgebung zu ändern.

    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()
    Nach dem Login kopieren
    Nach dem Login kopieren

    6. Verschachtelung von Funktionen

    Bevor wir nichtlokal lernen, müssen wir uns etwas Wissen über die Verschachtelung von Funktionen aneignen.

    Innere Funktionen und äußere Funktionen

    Funktionen können ineinander verschachtelt werden. Die äußeren werden als äußere Funktionen bezeichnet, die inneren als innere Funktionen.

    var = 1  # 变量在最外层的函数之外,也就是全局变量,nonlocal无法修改
    
    def outer():
    
       def inner():
    
          def smaller():
    
             nonlocal var    # error,没有局部变量
             var = 2
             print(var)
    
          smaller()
    
       inner()
    
    outer()
    Nach dem Login kopieren
    Nach dem Login kopieren
    • Die innere Funktion kann nicht direkt außerhalb der äußeren Funktion aufgerufen werden

    • Nach dem Aufruf der äußeren Funktion kann die innere Funktion nicht außerhalb der Funktion aufgerufen werden

    • Die innere Funktion kann nur innerhalb der äußeren Funktion aufgerufen werden

    • Wenn eine intrinsische Funktion innerhalb einer äußeren Funktion aufgerufen wird, gibt es eine Sequenz, die vor dem Aufruf definiert werden muss, da Python keinen Vorlesemechanismus hat. Dieser Vorlesemechanismus ist auf alle Szenarien in Python anwendbar.

    # 外层是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;
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    二、LEGB原则

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

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

    Definition und Verwendung des globalen Raums und des lokalen Raums in 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
    Nach dem Login kopieren
    Nach dem Login kopieren

    假如上一层的局部环境中没有这个变量怎么办,那么就根据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()
    Nach dem Login kopieren
    Nach dem Login kopieren

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

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

    三、总结

    全局变量和局部变量

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

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

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

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

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

    关键字:

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

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

    Das obige ist der detaillierte Inhalt vonDefinition und Verwendung des globalen Raums und des lokalen Raums in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage