1. 程式人生 > >Python 基礎 -2.4 函數進階

Python 基礎 -2.4 函數進階

而且 pos 被調用 local 作用 eve ner uil 們的

名稱空間

又名name space, 顧名思義就是存放名字的地方,存什麽名字呢?舉例說明,若變量x=1,1存放於內存中,那名字x存放在哪裏呢?名稱空間正是存放名字x與1綁定關系的地方

名稱空間共3種,分別如下

  • locals: 是函數內的名稱空間,包括局部變量和形參
  • globals: 全局變量
  • builtins: 內置模塊的名字空間

不同變量的作用域不同就是由這個變量所在的命名空間決定的。

作用域即範圍

  • 全局範圍:全局存活,全局有效
  • 局部範圍:臨時存活,局部有效

查看作用域方法 globals(),locals()

作用域查找順序

level = ‘L0‘
n = 22


def func():
    level = ‘L1‘
    n = 33
    print(locals())

    def outer():
        n = 44
        level = ‘L2‘
        print(locals(),n)

        def inner():
            level = ‘L3‘
            print(locals(),n) #此外打印的n是多少?
        inner()
    outer()


func()

問題:在inner()裏的打印的n的值是多少?

LEGB 代表名字查找順序: locals -> enclosing function -> globals -> __builtins__

  • locals 是函數內的名字空間,包括局部變量和形參
  • enclosing 外部嵌套函數的名字空間
  • globals 全局變量,函數定義所在模塊的名字空間
  • builtins 內置模塊的名字空間

閉包

關於閉包,即函數定義和函數表達式位於另一個函數的函數體內(嵌套函數)。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。也就是說,內部函數會在外部函數返回後被執行。而當這個內部函數執行時,它仍然必需訪問其外部函數的局部變量、參數以及其他內部函數。這些局部變量、參數和函數聲明(最初時)的值是外部函數返回時的值,但也會受到內部函數的影響。

def outer():
    name = ‘alex‘

    def inner():
        print("在inner裏打印外層函數的變量",name)

    return inner


f = outer() 

f()

閉包的意義:返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域

裝飾器

Python 基礎 -2.4 函數進階