La définition et l'utilisation de l'espace global et de l'espace local en Python

王林
Libérer: 2023-05-07 16:55:08
avant
1254 Les gens l'ont consulté

    1. Espace et espace local

    1. proposé de diviser et de contrôler si les variables sont visibles et la durée de leur durée de vie ; la portée d'un espace de noms est appelée portée.

    Divisez une zone pour enregistrer toutes les données et les stocker dans un dictionnaire (les variables et les valeurs forment une relation cartographique). Il existe trois types au total.


    Espace de noms intégré :

    Créé au démarrage de l'interprète, jusqu'à la fin de l'exécution de l'interprète, le cycle de vie le plus long #🎜 ; 🎜# Espace de noms global :

    Créé lors de l'exécution du fichier, jusqu'à la fin de l'interpréteur, le cycle de vie est long Espace de noms local :
    #🎜 ; 🎜#Nombre d'appels Les variables locales à l'intérieur sont créées uniquement lorsque l'appel est terminé et sont libérées une fois l'appel terminé, avec un cycle de vie court ; Démarrer->Créer un espace de noms intégré->Créer un espace de noms global-> ;Créer un espace de noms local
    Séquence de destruction :
    Une fois l'appel de fonction terminé->Détruire les données de l'espace de noms local correspondant à la fonction -> Détruisez les données d'espace de noms intégrées

    2, les variables globales et les variables locales#🎜🎜 #Que sont les variables globales et locales :

    #🎜 🎜#Les variables locales sont des variables définies à l'intérieur de la fonction. La variable locale est située dans l'espace de noms local, et la portée n'est visible qu'à l'intérieur de la fonction, c'est-à-dire ne peut être utilisée qu'à l'intérieur des fonctions.

    # 在函数中创建的变量就是局部变量
    def func():
       var = '局部变量'
    
    # 局部变量不可以在非对应局部环境中使用
    print(var)  # error, 该变量不存在
    Copier après la connexion
    Les variables globales sont des variables définies en dehors de la fonction ou définies à l'intérieur de la fonction à l'aide de global. L'espace de noms où se trouve la variable globale est l'espace de noms global. le fichier entier. Les variables globales peuvent être utilisées n’importe où dans .
    # 在全局环境中创建的变量就是全局变量
    var = '全局变量'
    
    def func():
        # 在局部中也可以使用全局变量
        print(var)  # 全局变量
    
    func()
    Copier après la connexion

    Il est préférable de ne pas utiliser de variables locales portant le même nom que des variables globales. Si elles portent le même nom, la variable globale ne peut pas être utilisée dans l'environnement local.

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

    Les fonctions intégrées sont des espaces de noms intégrés, qui font référence aux fonctions intégrées fournies avec Python.

    3. Portée

    Portée de la variable locale :

    À l'intérieur de la fonction

    Portée de la variable globale :

    Dans l'ensemble du fichier

    4. Cycle de vie

    Variables intégrées-> Variables globales-> programme , il ne sera pas publié avant la fin du programme Python ;

    Les variables globales ne seront pas publiées tant que le programme n'est pas terminé ou effacé

    Les variables locales seront créées depuis le début jusqu'à ce que l'espace local soit exécuté ; sera publié lorsqu'il sera terminé ou effacé ; 🎜#
    globals()

    Renvoie le contenu de toutes les étendues globales.

    S'il est global, après avoir appelé globals, toutes les variables avant impression seront obtenues, et le dictionnaire sera renvoyé, ainsi que la portée de l'espace global

    # 定义一些全局变量
    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;
    Copier après la connexion
    #🎜🎜 ; #S'il est local, il sera appelé Après globals, vous obtenez les variables utilisées avant l'appel, renvoyez le dictionnaire et la portée de l'espace global
    # 定义一些全局变量
    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;
    Copier après la connexion

    globals peut ; créer dynamiquement des variables globales
    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;
    Copier après la connexion
    #🎜🎜 #

    locals()

    Renvoie tout le contenu de la portée actuelle. S'il est global, après avoir appelé les locaux, toutes les variables avant l'impression seront obtenues et le dictionnaire sera renvoyé dans la portée de l'espace global

    # 定义一些全局变量
    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;
    Copier après la connexion

    S'il est local, appelez locals</code >Après cela, toutes les variables avant l'appel sont obtenues, le dictionnaire est renvoyé et la portée de l'espace local est renvoyée ="https://img.php.cn/upload/article/000/465 ; /014/168344971228691.png" alt="Que sont l'espace global et l'espace local Python" /><p><img src="https://img.php.cn/upload/article/000/465/014/168344971114335.png" alt="La définition et lutilisation de lespace global et de lespace local en Python" />#🎜 🎜#global</p><p><strong>Variables créées dans le l'environnement local sont des variables locales et ne peuvent pas être utilisées dans l'environnement global. Mais une variable définie à l'aide de global est une variable globale, qui peut être utilisée dans l'environnement global. </strong><div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Copier après la connexion</div></div></p>La valeur des variables globales ne peut pas être modifiée dans l'environnement local. Utilisez <code>global pour modifier les variables globales dans l'environnement local.

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

    6. Imbrication de fonctions globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域;

    var = &#39;全局变量&#39;
    
    def func():
        global var
        var = &#39;局部环境中修改&#39;
    
    func()
    
    print(var)  # 局部环境中修改
    Copier après la connexion

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

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

    globals可以动态创建全局变量

    # 外层是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;
    Copier après la connexion
    Copier après la connexion

    locals()

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

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

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

    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()
    Copier après la connexion
    Copier après la connexion

    关键字

    La définition et lutilisation de lespace global et de lespace local en Python

    global

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

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

    在局部环境中无法修改全局变量的值,使用global

    Avant d'apprendre le nonlocal, nous devons acquérir quelques connaissances sur l'imbrication de fonctions.

    Fonction interne et fonction externe

    Les fonctions peuvent être imbriquées les unes dans les autres. est appelée fonction intrinsèque. rrreee

    La fonction interne ne peut pas être appelée directement en dehors de la fonction externe
    • Après avoir appelé la fonction externe, la fonction interne ne peut pas non plus être appelée en dehors de la fonction. Lors d'un appel à l'intérieur d'une fonction étrangère, il y a une séquence qui doit être définie avant l'appel, car Python n'a pas de mécanisme de pré-lecture. Ce mécanisme de pré-lecture s'applique à tous les scénarios. en 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;
    Copier après la connexion
    Copier après la connexion

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

    二、LEGB原则

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

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

    La définition et lutilisation de lespace global et de lespace local en 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
    Copier après la connexion
    Copier après la connexion

    假如上一层的局部环境中没有这个变量怎么办,那么就根据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()
    Copier après la connexion
    Copier après la connexion

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

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

    三、总结

    全局变量和局部变量

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

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

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

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

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

    关键字:

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

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

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:yisu.com
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!