Python初學者零碎基礎筆記(三)全域性變數與區域性變數,閉包變數的區分用法

2020-10-12 13:00:26

全域性變數與區域性變數,閉包變數的區分

先擴充套件:

  1. 內建作用域:系統的函數和變數,在所有的檔案中都可以使用
    例:print(max(1,2,344,55)) # max屬於內建作用域
  2. 全域性作用域:在一個程式碼檔案中,變數(必須在函數外定義) 從定義開 始到本檔案結束
  3. 閉包作用域:巢狀函數中,外部函數裡 變數從定義開始到函數結束
  4. 區域性作用域: 在一個函數裡,變數從定義開始到函數結束
  5. 內建作用域 > 全域性作用域 >閉包作用域>區域性作用域
    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