a = 1 def func(): print(a) func()
函數func中,可使用函數外的變量a,這就涉及到命名空間和做用域。python
命名空間分三種函數
一、內置命名空間 —— python解釋器spa
內置命名空間在python一啓動的時候就可使用code
內置的名字,啓動解釋器的時候,就加載進內存裏blog
二、全局命名空間 —— 本身寫得代碼但不是函數中的代碼內存
從下到下執行代碼的時候加載進內存作用域
存放了設置的變量名和函數名input
三、內置命名空間 —— 函數class
函數內部定義的名字變量
當函數調用時,才產生這個命名空間,隨之函數的執行結束,這個命名空間也就消失
在局部:可使用全局和內置命名空間的名字
在全局:可使用內置命名空間中的名字,可是不能用局部命名空間的
在內置:不能使用全局和局部命名空間中的名字
def max(l): print("in max func") print(max([1,2,3,4]))
執行結果
正常狀況下,咱們能夠直接使用內置的名字
可是,若是在全局定義了和內置名字同樣的名字是,會使用全局的名字
多個函數,擁有多個獨立的局部命名空間,不共享
def input(): print("in input now!") def func(): print(input) # 打印的結果爲函數的地址,並不會執行函數 func()
func → 不加括號,獲取的是函數的地址
函數名()→ 調用函數
函數的內存地址()→ 調用函數
全局做用域 —— 做用全局 —— 內置和全局命名空間中的名字都屬於全局做用域 —— gloabs()
局部做用域 —— 做用局部 —— 函數(局部命名空間中的名字屬於局部做用域) —— locals()
# 在全局做用域,globals和locals同樣 print(globals()) print(locals()) # 在局部做用域,globals顯示全局做用域的名字,locals只顯示局部做用域的名字 def func(): a = 1 b = 2 print(globals()) print(locals()) func()
globals()永遠打印全局名字
locals()根據local所在位置,打印
對於全局做用域的不可變數據類型的變量,在局部做用域不可變。
若是須要修改,須要使用global參數申明
a = 1 def func1(): a += 1 # 更改全局的變量,報錯local variable 'a' referenced before assignment func1() a = 1 def func1(): global a a += 1 # 更改全局的變量,因爲申明瞭global a程序能夠執行 func1() print(a) # 由於申明瞭global,變量改變
使用global參數,更改變量的值,存在危險性。
不看函數代碼時,沒法知道變量是否改變。
所以,在改變全局域變量時,採起傳值——返回值的方式進行
a = 1 def func(a): a = 2 return a a = func(a) print(a)