全域變數與區域變數,閉包變數的區分
先擴展:
- ) 內建作用域:系統的函式和變數,在所有的檔案中都可以使用
例:print(max(1,2,344,55)) # max屬于內建作用域 - )全域作用域:在一個代碼檔案中,變數(必須在函式外定義) 從定義開 始到本檔案結束
- )閉包作用域:嵌套函式中,外部函式里 變數從定義開始到函式結束
- )區域作用域: 在一個函式里,變數從定義開始到函式結束
- )內建作用域 > 全域作用域 >閉包作用域>區域作用域
6 .) 變數同名問題: 變數查找規則: 從下往上,從里往外
(一)-------------------先區分全域變數與區域變數
1.全域變數的呼叫
name='小明' #全域變數(公共的,函式外定義,大家都可以呼叫)
def func():
print(name) #呼叫的是全域變數
func()
print(name)
def func1():
print(name) #呼叫的是全域變數
func1()
>>>小明
>>>小明
>>>小明
2.全域變數和區域重名,在函式里區域優先(例題小紅)
name='小明' #全域變數(公共的,大家都可以呼叫)
def func():
print(name) #呼叫的是全域變數
def func1():
name="小紅" #區域變數
print(name) #有區域變數先呼叫的是區域變數
func()
func1()
>>>小明
>>>小紅
3.在函式,全域變數可以讀取,不能直接修改;如果在函式中修改全域變數,必須施工global宣告
例如:改變全域變數錯誤做法
name='小明' #全域變數
def func():
name=name+"是好人" #簡寫:name += "是好人"
#不可以直接改變全域變數
print(name)#呼叫的是全域變數
func()
>>>報錯
>>>UnboundLocalError: local variable 'name' referenced before assignment
例:利用global修改全域變數
name='小明' #全域變數
def func1():
global name #借助global宣告可以改變全域變數
name=name+"是好人" #簡寫:name += "是好人"
print(name)#已改變原來的全域變數
func1()
print(name)
>>>小明是好人 #原來的全域變數name為'小明'
>>>>小明是好人
例:修改區域變數,區域變數,相當于自己的東西,隨時改變
name='小明' #全域變數
def func2():
name="小紅" #區域變數
name=name+"是好人" #修改區域變數
print(name) #已改變原來的區域變數
func2()
>>>小紅是好人 #原來的區域變數name為"小紅"
擴展:改變全域變數后再次呼叫原函式會怎樣?
結論:函式func的呼叫,原本print的是原全域變數
改變全域變數后再次呼叫func會發現print得到的結果不再是原來的值
name='小明' #全域變數
def func():
print(name)
func()
def func1():
global name #借助global宣告可以改變全域變數
name=name+"是好人" #簡寫:name += "是好人"
print(name)#已改變原來的全域變數
func1()
func() #再次呼叫原函式
>>>小明 #---原來的值(全域變數)
>>>小明是好人
>>>小明是好人#-----后來的值
---------------------全域變數與區域變數,閉包變數分布
z=5 # 全域作用域
def outter():
x = 10 # 閉包作用域
def inner():
y = 9 # 區域作用域
print(x)
例:全域與閉包
a = 10 # 全域
def demo():
a = 30 # 閉包
print(a)
def inner():
a = 20 # 區域
pass
inner()
print(a)
demo()
print(a)
>>>30
>>>30
>>>10
例:閉包與區域
def wrapper1():
x = 10 # 閉包變數
def inner():
x = 100 # 區域優先
print(x)
inner()
print(x)
wrapper1()
>>>100
>>>10
例:全域,閉包與區域
x=5 #全域
def wrapper1():
x = 10 # 閉包變數
def inner():
x = 100 #區域
print(x)
inner()
print(x)
wrapper1()
print(x)
>>>100
>>>10
>>>5
例:在函式里利用nonlocal修改閉包變數
x=5 #全域變數
def wrapper1():
x = 10 # 閉包變數
def inner():
nonlocal x # 宣告一下操作針對的是閉包變數x
x = 100 # 修改閉包變數x
print(x,"修改閉包變數nonlocal")
inner()
print(x)
print(x)
>>>100 修改閉包變數nonlocal
>>>100
>>>5
例:在函式里利用global修改全域變數
x=5 #全域變數
def wrapper1():
x = 10 # 閉包變數
def inner():
global x # 宣告一下操作針對的是全域變數x
x = 100 #區域
print(x,"修改全域變數 global")
inner()
print(x)
wrapper1()
print(x)
>>>100 修改全域變數 global
>>>10
>>>100
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/169979.html
標籤:其他
上一篇:python爬蟲代碼更新
