python 命名空間與作用域 可變與不可變對象 閉包
-
作用域規則順序為: L->E->G->B 如果變量在局部內找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再找不到就去內置中找。
-
若要在函數內使用global variable,則要么使用global聲明,要么通過函數參數傳遞。
-
Python 中只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的。
-
相對于nonlocal,global 關鍵字可以用在任何地方,包括最上層函數中和嵌套函數中,即使之前未定義該變量,global 修飾后也可以直接使用,而 nonlocal 關鍵字只能用于嵌套函數中,并且外層函數中定義了相應的局部變量,否則會發生錯誤。函數內global聲明未定義的變量x,只要函數中對x符值了,則x就成為了一個全局變量,可以在后續程序中使用。(nonlocal無此特性,見下圖:不能通過nonlocal聲明一個未定義的量,即使在nonlocal空間/下方標黃的部分/聲明一個全局,也不能通過nonlocal關聯這個變量a)
對于可變對象類型,地址不固定,而是創建一個可變對象時,找到一個地址,作為這個對象實例。所以相同值的兩個對象也是不同地址的兩個對象,也因此,對對象如列表進行操作,不會影響這個列表的地址,只會對地址擴充。而不可變數據類型:變量所指向的內存地址處的值是不可以被改變。 因此對于兩個相同值的對象,他們指針都指向同一個地址。
閉包:在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。閉包可以用來在一個函數與一組“私有”變量之間創建關聯關系。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。
閉包作用就是:
- 作用1:閉包是將外層函數內的局部變量和外層函數的外部連接起來的一座橋梁。(并且能保證全局命名空間不被污染)
- 作用2:將外層函數的變量持久地保存在內存中。(這一步是因為調用閉包函數的父函數時,會返回閉包函數,如果這個返回被賦值到一個全局變量,則由于閉包函數的存在依賴于父函數中的nonlocal變量,導致父函數不會在調用后被垃圾回收機制(garbage collection)回收)
ref:
python 命名空間和作用域詳解 - 知乎
閉包,看這一篇就夠了——帶你看透閉包的本質,百發百中-CSDN博客
【Python面試】 說說Python可變與不可變數據類型?-騰訊云開發者社區-騰訊云
Python閉包(Closure)詳解 - 知乎
閉包,看這一篇就夠了——帶你看透閉包的本質,百發百中-CSDN博客