python基礎-函數做用域

函數

函數對象

  • 函數是第一類對象
  • 函數名能夠被引用
  • 函數名能夠看成參數使用
  • 函數名能夠看成返回值使用
  • 函數名能夠看成容器類型的元素

函數嵌套

  • 嵌套調用:在函數內部中調用函數python

  • 嵌套定義:在函數內部中定義函數函數

名稱空間

存放變量名稱的空間,分爲內置名稱空間全局名稱空間局部名稱空間code

  • 內置名稱空間:python中,提早定義的名字,存在內置名稱空間中。例如:關鍵字、內置方法對象

  • 全局名稱空間:存放於文件級別的名字,就是全局名稱空間生命週期

    if / while / for 內部定義的名字,在執行以後都存放於全局名稱空間內存

    # if 的示例:
    var = 4
    if var > 5:
        var = "var 大於5"
    else:
        var = "var 小於等於5"
    print(var)        # 打印結果:var 小於等於5
    
    # while 的示例:
    num = 0
    while num <= 3:
        num += 1
    print(num)        # 打印結果:4
    
    # for 的示例
    for i in range(2):
        pass
    print(i)      # 打印結果:1
  • 局部名稱空間函數內部定義的全部名字都是存放於當前函數的內置名稱空間作用域

若是想訪問一個變量值,必須先訪問對應的名稱空間,獲取到該變量的名稱以及名稱和值內存地址之間的關係。class

生命週期

  • 內置名稱空間python 解釋器啓動時生效,關閉時失效
  • 全局名稱空間當前python文件執行生效,執行結束後失效
  • 局部名稱空間函數調用時生效,函數體代碼結束時失效

查找順序

  • 局部名稱:局部 全局 內置函數容器

  • 全局名稱:全局 內置變量

    內置再找不到就會報錯

  • 函數內部使用的名字,在定義階段已經規定死了,與調用位置無關

做用域

  • 全局做用域全局能夠調用的名字存在於全局做用域。內置名稱空間和全局名稱空間屬於此處
  • 局部做用域局部能夠調用的名字存在於局部做用域。局部名稱空間屬於此處

  • global:將局部名稱空間的變量聲明成全局變量

    注意:global須要在函數內部聲明,若在函數外聲明,則函數依然沒法操做

    # 這種狀況不能修改x1的值
    x1 = 1
    def func1():
        x1 = 2
    func1()
    print(x1)  # 打印結果:1
    
    # 使用global 後,能夠修改x2的值
    x2 = 1
    def func2():
        global x2 # 先聲明成全局變量
        x2 = 2
    func2()
    print(x2) # 打印結果:2
    
    # global 若在函數外聲明,沒法操做變量
    global x3
    x3 = 1
    def func2():
        x3 = 2
    func3()
    print(x3) # 打印結果:1
  • nonlocal:在局部名稱空間聲明局部變量

    nonlocal 聲明後的變量會從當前函數的外層函數開始一層層去查找該變量。如果一直到最外層函數都找不到,則會拋出異常。

    def f3():
        x = 4
        def f1():
            y = 2
            def f2():
                nonlocal x
                x = 3
            f2()  # 調用f2(),修改f1做用域中名字x的值
            print(x)  # 在f1做用域查看x。打印結果:3
        f1()
        print(x)  # 打印結果:3
    f3()
    def f3():
        x = 4
        def f1():
            x = 2
            def f2():
                nonlocal x
                x = 3
            f2()  # 調用f2(),修改f1做用域中名字x的值
            print(x)  # 在f1做用域查看x。打印結果:3
        f1()
        print(x)  # 打印結果:4
    f3()
相關文章
相關標籤/搜索