先擴充套件:
(一)-------------------先區分全域性變數與區域性變數
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