作用域---->作用范圍(作用域又叫作用范圍,在什么范圍內有效)
一、全局作用域:包含內置名稱空間、全局名稱空間
1.存活周期:該范圍內的名字全局存活(除非被刪除,否則在整個文件執行過程中存活)
2.全局有效,在任意位置都可以使用,被所有函數共享
二、局部作用域:包含局部名稱空間
1.存活周期:該范圍內的名字臨時存活(在函數調用時臨時生成,調用結束后就釋放)
2.局部有效,只能在函數內使用
三、global與nonlocal
1.如果在局部中想要修改全局的名字所對應的值,那么就需要global,主要針對不可變類型
示例1:global主要是針對不可變類型
x = 100 # 全局名稱空間(也是全局作用域)
def func():
global x # 使用global,表示修改全局作用域中的x
x = 200 # 在函數內,表示為局部名稱空間(也是局部作用域)
func()
print(x) # 輸出結果為:200,x=200為局部作用域,也是局部名稱空間,這里使用了global(表示修改全局中的),所以修改了全局中的x = 100
示例2:示例1中主要是針對不可變類型的,示例2針對可變類型
x = [] # 全局名稱空間,聲明的是一個數組
def func():
a.append(111) # 直接對數組進行添加操作,對於可變類型的就不用使用global了,因為在函數中可以直接對可變類型進行操作
func()
print(x) # 輸出結果為:[111]
2.修改函數外層函數包含的名字對於的值(與global一樣針對不可變類型),這是需要使用nonlocal
示例1:針對不可變類型
x = 100 # 全局名稱空間
def func():
x = 200 # 局部名稱空間
def func1():
nonlocal x # 表示修改該層函數上層函數的x,如果有三層函數,找上層表示先找第二層,如果沒有找到則會找第一層,如果還沒有就會報錯,不會找全局
x = 300
func1()
print(x) # 輸出結果為:300,x =300為局部作用域,這里使用了nonlocal(表示修改func1上一層中的名稱對應的值),所以修改了x=200的值
func()
示例2:針對可變類型時,與global一樣的,直接進行修改即可,不適用nonlocal