91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python全局空間和局部空間是什么

發布時間:2022-04-06 15:11:56 來源:億速云 閱讀:123 作者:iii 欄目:開發技術

這篇“Python全局空間和局部空間是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python全局空間和局部空間是什么”文章吧。

    一、空間和局部空間

    1、命名空間

    命名空間的概念的提出是為了劃分和控制變量是否可見,以及生存周期的長短;命名空間的作用范圍叫做作用域。
    劃分一塊區域保存所有數據,以字典的方式存儲(變量與值形成映射關系)。一共三種。

    內建命名空間:
    解釋器啟動時創建,直到解釋器運行結束,生存周期最長;
    全局命名空間:
    文件運行時創建,直到解釋器運行結束,生存周期較長;
    局部命名空間:
    數調用時,里面的局部變量才創建,調用結束后即釋放,生存周期較短;
    創建和銷毀順序
    創建順序:
    python解釋器啟動->創建內建命名空間->創建全局命名空間->創建局部命名空間
    銷毀順序:
    函數調用結束后->銷毀函數對應的局部命名空間數據->銷毀全局命名空間數據->銷毀內建命名空間數據

    2、全局變量和局部變量

    什么是全局和局部變量:

    局部變量就是在函數內部定義的變量,局部變量所在的就是局部命名空間,作用域僅僅在函數內部可見,也就是說只能在函數內部使用。

    # 在函數中創建的變量就是局部變量
    def func():
       var = '局部變量'
    
    # 局部變量不可以在非對應局部環境中使用
    print(var)  # error, 該變量不存在

    全局變量就是在函數外部定義的或者使用global在函數內部定義的變量,全局變量所在的命名空間就是全局命名空間,作用域橫跨整個文件,就是說在整個文件中的任何一個地方都可以使用全局變量。

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

    局部變量最好不要和全局變量同名,如果同名,在局部環境中就無法使用全局變量了。

    var = '全局變量'
    
    def func():
        # 先使用了全局變量
        print(var)  # error, 找不到該變量
            # 然后局部變量和全局變量同名,那么新的局部變量就會在局部空間中覆蓋了全局變量的一切影響力,這就叫做局部變量修改了全局變量;
        # 這樣的話導致在局部空間中無法在使用該全局變量,之前在局部空間中使用的該變量就成為了先調用后定義;導致出錯。
        var = '局部變量'
        print(var)
    
    func()
    
    # 但是局部同名變量不會影響到全局變量的值
    print(var)  # 全局變量

    內置函數就是內建命名空間,指的是那些python中自帶的、內置的函數。

    3、作用域

    局部變量作用域:在函數的內部
    全局變量作用域:橫跨整個文件

    4、生命周期

    內置變量 -> 全局變量 -> 局部變量
    內置變量自python程序運行的時候開始,一直等到python程序結束之后才會釋放;
    全局變量自創建開始,一直到程序結束或者被清除才會釋放;
    局部變量字創建開始,一直到局部空間執行結束或者清除就會釋放;

    5、全局部函數和關鍵字的使用

    函數

    Python全局空間和局部空間是什么

    globals()

    返回所有的全局作用域中的內容。
    如果在全局,調用globals之后,獲取的是打印之前的所有變量,返回字典,全局空間作用域;

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

    如果在局部,調用globals之后,獲取的是調用之前的所用變量,返回字典,全局空間作用域;

    # 定義一些全局變量
    a, b, c = 1, 2, 3
    
    
    # 在局部環境中使用globals函數
    def func():
        res = globals()
        print(res)
    
    
    # 調用函數
    func()
    '''
    結果:不包含 d e f
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E7C287D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x000001E7C2772F28>}
    '''
    
    
    # 再定義一些全局變量
    d, e, f = 4, 5, 6
    
    # 第二次調用函數
    func()
    '''
    結果:包含 d e f
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000021A3F3DD198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'a': 1, 'b': 2, 'c': 3, 'func': <function func at 0x0000021A3F2D2F28>, 'd': 4, 'e': 5, 'f': 6}
    '''

    globals可以動態創建全局變量

    dic = globals()
    
    print(dic)  # 返回系統的字典
    '''
    結果:
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000026F357ED198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}}
    '''
    
    
    # 在全局的字典當中,通過添加鍵值對,自動創建全局變量,對應的鍵是變量名,對應的值是變量指向的值
    dic['msr123123123'] = '123456'
    
    print(msr123123123) # 123456
    
    # 查看全局內容
    print(dic)
    '''
    結果:
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000161D944D198>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/0-project/python/mymsr/ceshi/test6.py', '__cached__': None, 'dic': {...}, 'msr123123123': '123456'}
    '''

    locals()

    返回當前所在作用域的所有內容。
    如果在全局,調用locals之后,獲取的是打印之前的所有變量,返回字典,全局空間作用域;

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

    如果在局部,調用locals之后,獲取的是調用之前的所有變量,返回字典,局部空間作用域;

    # 定義一些局部變量
    def func():
       # 局部變量
       aa, bb, cc = 11, 22, 33
    
       # 第一遍調用
       res = locals()
    
       # 第一次打印,包含 aa bb cc
       print(res)  # {'cc': 33, 'bb': 22, 'aa': 11}
    
       # 再定義一些局部變量
       dd, ee, ff = 44, 55, 66
    
       # 第二次打印,不包含 dd ee ff
       print(res)  # {'cc': 33, 'bb': 22, 'aa': 11}
    
       # 調用第二遍
       res2 = locals()
    
       # 打印第一次的調用,包含 dd ee ff
       print(res)  # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}}
       
       # 打印第二次的調用,包含 dd ee ff
       print(res2) # {'cc': 33, 'bb': 22, 'aa': 11, 'ff': 66, 'ee': 55, 'dd': 44, 'res': {...}}
    
    # 調用函數,返回在函數中的局部變量
    func()

    關鍵字

    Python全局空間和局部空間是什么

    global

    在局部環境中創建的變量是局部變量,在全局環境中是不可以使用的。但是使用global定義的變量就是一個全局變量,這個變量可以全局環境中使用。

    def func():
        var = '局部變量'
    
        global glvar
        glvar = '全局變量'
    
    # 一定要執行局部環境喲
    func()
    
    # 全局環境中
    print(var)  # error,局部變量不能調用
    # 使用global定義的變量是全局變量
    print(glvar)    # 全局變量

    在局部環境中無法修改全局變量的值,使用global可以在局部環境中修改全局變量。

    var = '全局變量'
    
    def func():
        global var
        var = '局部環境中修改'
    
    func()
    
    print(var)  # 局部環境中修改

    6、函數的嵌套

    在學習nonlocal之前我們需要先學習一些關于函數嵌套的知識。

    內函數和外函數

    函數之間是可以互相嵌套的,外層的叫做外函數,內層的叫做內函數。

    def outer():
        print('我叫outer,是外函數')
    
        def inner():
            print('我叫inner,在outer的里面,是內函數')
    
        # 在外函數中執行內函數
        inner()
    
    
    # 執行外函數
    outer()
    
    '''
    結果:
    我叫outer,是外函數
    我叫inner,在outer的里面,是內函數
    '''
    • 內函數不可以直接在外函數外執行調用

    • 調用外函數后,內函數也不可以在函數外部調用

    • 內函數只可以在外函數的內部調用

    • 內函數在外函數內部調用時,有先后順序,必須先定義在調用,因為python沒有預讀機制,這個預讀機制適用于python中的所有場景。

    # 外層是outer,內層是inner,最里層是smaller,調用smaller里的所有代碼
    def outer():
        print('我叫outer,是最外層函數,是inner和smaller的外函數')
    
        def inner():
            print('我叫inner,是outer的內函數,是smaller的外函數')
    
            def smaller():
                print('我叫smaller,是outer和inner的內函數')
    
            # 先在inner中執行smaller
            smaller()
    
        # 然后在outer中執行inner
        inner()
    
    # 最后再執行outer才能執行smaller函數
    outer()
    
    '''
    結果:
    我叫outer,是最外層函數,是inner和smaller的外函數
    我叫inner,是outer的內函數,是smaller的外函數
    我叫smaller,是outer和inner的內函數
    '''

    我們在多個函數嵌套的時候要注意,不管外函數還是內函數,都是函數,只要是函數中的變量都是局部變量。
    內涵可以使用外函數的局部變量,外函數不能直接使用內函數的局部變量。

    二、LEGB原則

    LEGB原則就是一個就近找變量原則,依據就近原則,從下往上,從里向外,依次尋找。

    B&mdash;&mdash;&mdash;&mdash;Builtin(Python):Python內置模塊的命名空間    (內建作用域)
    G&mdash;&mdash;&mdash;&mdash;Global(module):函數外部所在的命名空間        (全局作用域)
    E&mdash;&mdash;&mdash;&mdash;Enclosing Function Locals:外部嵌套函數的作用域(嵌套作用域)
    L&mdash;&mdash;&mdash;&mdash;Local(Function):當前函數內的作用域           (局部作用域)

    Python全局空間和局部空間是什么

    nonlocal

    現在我們正式學習nonlocal關鍵字,nonlocal的作用是修改當前局部環境中上一層的局部變量。那么我們根據這個作用便知道了nonlocal的使用環境至少是一個二級的嵌套環境,且外層的局部環境中必須存在一個局部變量。

    def outer():
        # 定義變量
        lvar = 'outer var'
    
        def inner():
            # 內函數使用nonlocal修改上一層的局部變量
            nonlocal lvar
            lvar = 'inner var'
    
        # 執行inner函數
        inner()
        print(lvar)
    
    outer() # inner var

    假如上一層的局部環境中沒有這個變量怎么辦,那么就根據LEGB原則向上尋找。

    def outer():
        # 定義變量
        lvar = 'outer var'
    
        def inner():
            
            def smaller():
                
                # smaller中修改變量,但是inner中沒有,就向上尋找修改outer中的變量
                nonlocal lvar
                lvar = 'smaller var'
    
            # 執行 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全局空間和局部空間是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    二连浩特市| 霍城县| 凤凰县| 衡东县| 武定县| 马鞍山市| 会东县| 新兴县| 江华| 松潘县| 辽中县| 垣曲县| 札达县| 乐业县| 长汀县| 双江| 海原县| 新竹县| 施甸县| 沛县| 莎车县| 巫山县| 高淳县| 天长市| 称多县| 东城区| 新乐市| 祥云县| 托克逊县| 通州区| 永年县| 宁海县| 通江县| 株洲县| 德令哈市| 同仁县| 海晏县| 涟源市| 金昌市| 乐业县| 乌拉特中旗|