第十天函式進階
---恢復內容開始---
一 名稱空間:
全域性名稱空間:在定義函式和變數的時候會生成一個全域性名稱空間,在程式從上到下被執行的過程中被一次載入進記憶體。
例如:我們曾經定義過的函式名或變數名稱。
區域性名稱空間:就是函式內部定義的名稱。在函式呼叫過程中才會被放到記憶體中
內建名稱空間:python直譯器啟動時就存在於記憶體中的空間。
例如:print() list() input() 等都有內建的名稱空間。
在區域性:可以使用全域性和內建名稱空間
在全域性:可以使用內建名稱空間和全域性名稱空間的變數
即在大空間不能使用小空間裡的變數,但是在小空間裡可以使用大空間裡的變數。
在內建的名稱空間裡,是不能使用全域性和全域性變數的。
另外注意:如果定義了和內建函式的自定義函式,自定義函式會覆蓋內建函式。
多個區域性空間之間各自的變數是不共享的。
二 作用域:
全域性作用域:作用在全域性,包含全域性和內建名稱空間中的名字。
區域性作用域:作用在區域性,包含函式內的名字。
注意,對於不可變型別,在區域性可以檢視全域性變數,但是不能直接修改。如果想要修改的話,需要使用global聲名。
但是儘量不要使用global 聲名,儘量使用傳參和接受引數去在區域性和全域性中傳遞引數。
a = 1
def adda():
global a
a += 1
print(a)
adda()
>>> 2
以上程式碼意味著,函式使用的是全域性變數,而不是函式內的區域性變數。
locals() :用於檢視全部的區域性變數。
globals() :用於檢視全部的全域性變數,甚至包含在區域性中的變數。
三 閉包
在外部函式定義了變數,在內部函式中呼叫了外部函式的變數,就以意味著這個內部函式就是一個閉包函式。
如果print(函式名.__closure)如果列印了一個cell的結果,那麼這個函式就是一個閉包。
標準格式:
def outer():
a = 1
def inner():
print(a)
return inner
inn = outer()
inn()
意義:這個時候,雖然a不是一個全域性變數,但是這個變數是會始終存在於記憶體中的。這個變數不會影響全域性變數,又可以隨時使用。
目前應該還沒有需求點,但是以後對於程式的優化作用是很大的。