>  기사  >  백엔드 개발  >  Python의 전역 공간과 로컬 공간의 정의 및 사용

Python의 전역 공간과 로컬 공간의 정의 및 사용

王林
王林앞으로
2023-05-07 16:55:081288검색

    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 프로그램이 끝날 때까지 해제되지 않습니다.

    전역 변수는 생성부터 시작되고 프로그램이 종료되거나 지워질 때까지 해제되지 않습니다.

    로컬 변수는 생성부터 시작되어 종료될 때까지 계속됩니다. local 실행이 완료되거나 지워지면 공간이 해제됩니다.

    5. 모든 로컬 함수 및 키워드 사용

    함수

    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 , 호출 전에 사용된 변수를 가져오고 사전 및 전역 공간 범위를 반환합니다.

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

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

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

    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()

    locals()

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

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

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

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

    关键字

    Python의 전역 공간과 로컬 공간의 정의 및 사용

    global

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

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

    在局部环境中无法修改全局变量的值,使用globalglobals는 전역 변수를 동적으로 생성할 수 있습니다.

    # 外层是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;

    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

    로컬인 경우 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()

      Keywords
    • 파이썬의 글로벌 공간과 로컬 공간이 무엇인가요
    • global

    • 로컬 환경에서 생성된 변수는 로컬 변수이므로 글로벌 환경에서는 사용할 수 없습니다. 단, global을 사용하여 정의한 변수는 전역 변수이므로 전역 환경에서 사용할 수 있습니다.

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

      글로벌 변수의 값은 로컬 환경에서 수정할 수 없습니다. 로컬 환경에서 글로벌 변수를 수정하려면 global을 사용하세요.
    • rrreee
    • 6. 함수 중첩

      비로컬을 배우기 전에 함수 중첩에 대한 지식을 배워야 합니다. 🎜🎜🎜내부 함수와 외부 함수🎜🎜🎜함수는 서로 중첩될 수 있습니다. 외부 함수를 외부 함수라고 하며 내부 함수를 내부 함수라고 합니다. 🎜rrreee🎜🎜🎜내부 함수는 외부 함수 외부에서 직접 호출할 수 없습니다.🎜🎜🎜🎜외부 함수를 호출한 후에는 내부 함수를 함수 외부에서 호출할 수 없습니다.🎜🎜🎜🎜내부 함수는 외부 함수 내부에서만 호출할 수 있습니다. 🎜🎜🎜🎜 내부 함수가 외부 함수 내에서 호출되면 시퀀스가 ​​있으며 호출하기 전에 정의해야 합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제