Python 基礎 -2.4 函數進階
阿新 • • 發佈:2018-01-21
而且 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 函數進階