函數二----函數的進階
阿新 • • 發佈:2017-12-27
應該 fun 全局變量 內存地址 根據 內部 不可 可變 一個
一、命名空間(有三種)
1.內置的命名空間 -----python解釋器
就是python解釋器一啟動就可以使用的名字存儲再內置的命名空間中
內置的名字在啟動解釋器的時候被加載進內存裏。
2.全局命名空間 -----我們寫的代碼,但不是函數中的代碼
是在程序從上到下被執行的過程中依次加載進內存的
放置了我們設置的所有變量名和函數名
3.局部命名空間 -----函數
就是函數內部定義的名字
當調用函數的時候,才會產生這個名稱空間,隨著函數執行的結束,這個命名空間就又消失了
三種命名空間之間的加載順序:
內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
#在局部:可以使用全局、內置命名空間中的名字
#在全局:可以使用內置命名空間中的名字,但是不能用局部中命名空間中的名字
#在內置:不能使用全局、局部命名空間中的名字
def func(): a = 1 func() print(a) #因為全局沒有a這個變量,它不可能去找func函數裏的這個a變量,所以會報錯
#在正常情況下,直接使用內置的名字
#當我們在全局定義了和內置名字空間中同名的名字時,會使用全局的名字
#當我自己有的時候,我就不找我的上級要了
#如果自己沒有,就找上一級要,上一級沒有再找上一級,如果內置的名字空間都沒有,就報錯
#多個函數應該擁有多個獨立的局部命名空間,不互相共享
def input(): print(‘in input now‘) def func(): # input = 1 print(input) func() # <function input at 0x0000028967220378> ---函數的內存地址() #func ---> 函數的內存地址 #函數名() --->函數的調用 #函數的內存地址() --->函數的調用
二、作用域
#全局作用域 ---作用在全局 ---內置和全局名字空間中的名字都屬於全局作用域---globals()
#局部作用域 --- 作用在局部 --- 函數(局部名字空間中的名字屬於局部作用域)---locals可以查看
a = 1 def func(): return a print(func()) # 1 a = 1 def func(): global a a += 1 func() print(a) #2 func() print(a) #3 a = 1 def func(a): a = 2 return a a = func(a) print(a) #2
#對於不可變數據類型,在局部可以查看全局作用域中的變量,但是不能直接修改
#如果想要修改,需要在程序的一開始添加global聲明
#如果在一個局部(函數)內聲明了一個global變量,那麽這個變量在局部的所有操作將對全局變量有效
a = 1 b = 2 def func(): x = ‘aaa‘ y = ‘bbb‘ print(locals()) # {‘x‘: ‘aaa‘, ‘y‘: ‘bbb‘} print(globals()) func() print(globals()) print(locals()) #本地的,放在全局,全局就是本地;放在局部,局部就是本地
#globals 永遠打印全局的名字
#locals 輸出什麽,根據locals所在的位置
函數二----函數的進階