標籤:報錯 內建函式 直接 記憶體 code 命名 上層 修改 消失
函數進階
# a = 1# def func():# print(a)# func()# 函數外面定義的變數在函數裡面能用,# 在函數裡面定義的變數在函數外面不能用# def func():# a = 1# func()# print(a) # 報錯
命名空間和範圍
內建命名空間 -- Python解譯器
Python解譯器一啟動就將可以使用的名字儲存在內建命名空間中
內建的名字在啟動解譯器的時候被載入進記憶體裡
全域命名空間-- 我們寫的函數之外的代碼
是在程式從上至下執行的過程中依次載入進記憶體的
放置了我們設定的所有變數和函數名
局部命名空間 -- 函數
就是函數內部定義的名字
當調用函數的時候才會產生這個命名空間,隨著函數執行的結束,這個命名空間就又消失了
在局部:可以使用內建,全域命名空間中的名字
在全域:可以使用內建命名空間中的名字,但不能使用局部命名空間中的名字
在內建:是不能使用局部和全域命名空間的名字的
# def max():# print(‘in max func‘)# max()# def max(l):# print(‘in max func‘)# print(max([1,2,3]))# 在正常情況下,直接使用內建的名字,# 當我們在全域定義了和在內建空間一樣的名字時,會使用全域的名字# 當自己有的時候,就不找自己的上級要了# 如果自己沒有就找上級要,上級沒有再找上一級,內建的命名空間都沒有的話直接報錯# 多個函數用該有多個獨立的局部名字空間,不互相共用## def input():# print(‘in input now!‘)## def func():# input() # 調用input()# func()# def func():# # input = 1# print(func)# func() #---><function func at 0x000001B08D6FC1E0># def func1():# a = 1# def func2():# print(a)# 兩個局部命名空間相互獨立不能共用# func --> 函數的記憶體位址# 函數名()--> 函數的調用# 函數的記憶體位址() --> 函數的調用
範圍
全域範圍 --> 作用在全域-->內建和全域名字空間中的名字都屬於全域範圍 --> globals()
局部範圍 --> 作用在局部 -->函數(局部名字空間中的名字屬於局部範圍) --> locals()
# a = 1# def func():# global a# a += 1# func()# print(a)# 對於不可變資料類型,在局部可以查看全域範圍中的變數# 但是不能直接修改,# 如果想要修改,需要在程式一開始添加 global 聲明# 如果在一個局部(函數)內聲明了一個global 變數,那麼這個變數在局部的所有操作將對全域有效# a = 1# b = 2# def func():# x = ‘aaa‘# y = ‘bbb‘# print(locals())# func()# print(globals())# def func():# x = ‘aaa‘# y = ‘bbb‘# print(locals())# print(globals())# func()# print(locals()) # 本地的 在局部本地就是局部在全域本地就是全域# print(globals())# globals 永遠列印全域的名字# locals 輸出什麼 根據locals所在的位置
函數的嵌套和範圍鏈
函數的嵌套調用
# def max(a, b):# return a if a > b else b# def the_max(x, y, z): # 函數的嵌套調用# c = max(x, y)# return max(c, z)# print(the_max(1, 2, 3))
函數的嵌套定義
# a = 1# def outer():# a = 1# def inner():# a = 2# print(a)# print(‘inner‘)# def inner2():# nonlocal a # 聲明了一個上面第一層局部變數# a += 1 # 不可變資料類型的修改# print(‘inner2‘)# inner2()# print(‘##a##‘, a)# inner()# print(‘**a**‘, a)# outer()# print(‘全域‘, a)# nonlocal 只能用於局部變數,找上層中離當前函數最近一層的局部變數# 聲明了nonlocal 的內建函式的變數修改會影響到上層中離當前函數最近一層的局部變數# 對全域無效 對局部也只是對最近的一層有影響
函數名的本質:函數的記憶體位址
# a = 1# def outer():# a = 1# def inner():# a = 2# print(a)# print(‘inner‘)# def inner2():# nonlocal a # 聲明了一個上面第一層局部變數# a += 1 # 不可變資料類型的修改# print(‘inner2‘)# inner2()# print(‘##a##‘, a)# inner()# print(‘**a**‘, a)# outer()# print(‘全域‘, a)# nonlocal 只能用於局部變數,找上層中離當前函數最近一層的局部變數# 聲明了nonlocal 的內建函式的變數修改會影響到上層中離當前函數最近一層的局部變數# 對全域無效 對局部也只是對最近的一層有影響
python 函數進階