標籤:nonlocal 自己 嵌套 bubuko 例子 東北 全域 info 地方
全域變數:在定義的時候,頂頭寫的,沒有任何縮排的變數就是全域變數。
全域變數的特點:在當前檔案裡的任何地方都可以進行調用
局部變數:在子程式裡定義的變數,就是局部變數。
子程式:比如.py檔案裡,寫的函數就是個子程式。而這個函數裡定義的變數就是局部變數
樣本:全域變數
# 全域變數name=‘alex‘ def change_name(): print(‘change_name‘,name) # 調用了全域變數change_name()# 結果change_name alexprint(name) #調的是全域變數# 結果alex
樣本:函數體內定義局部變數
# 全域變數:全域範圍name=‘alex‘def change_name(): name=‘帥呆了‘ # 局部變數:局部範圍 print(‘change_name‘,name) # 先在自己的子程式裡找,調用了局部變數# 舉個生活中的例子,剛起床找手機,肯定現在自己臥室(函數)找,自己臥室找不到,才可能會到臥室(函數之外)之外去找。# 所以,很好的理解,就是優先內部,然後外部;局部變數只能該函數自己使用(私心重),全域變數就比較大方,誰需要就可以拿去用change_name() # 結果change_name 帥呆了print(name) #調的是全域變數# 結果alex
樣本:函數體內聲明全域變數
# 全域變數name=‘alex‘def change_name(): global name # 函數體內聲明了全域變數 name=‘帥呆了‘ # 函數體內修改了全域變數的值 print(‘change_name‘,name) # 調用了全域變數change_name()# 結果change_name 帥呆了print(name) #調的是全域變數,但是全域變數的值已經被修改# 結果帥呆了
更好的樣本
如果函數的內容無global關鍵字,優先讀取局部變數;如果沒有局部變數,只能讀取全域變數,無法對全域變數重新賦值,但於可變類型,是可以對內部元素進行操作
如果函數的內容有global關鍵字,函數內的變數就是全面局變數,可以讀取,可以賦值
name = "桃花李"def yangjian(): global name # 已經聲明,NAME就是全域的的那個變數 print(‘我要‘, name) name = "小東北" # 修改 全域的變數 print(‘我要‘, name)def qupengfei(): name = "基" print(‘我要搞‘, name)yangjian()qupengfei()#結果我要 桃花李我要 小東北我要搞 基
總結
全域變數變數名大寫
局部變數變數名小寫
下面的樣本為了說明全域變數和局部變數的關係,都用的是大寫。
# 如果函數的內容無global關鍵字:# - 有聲明局部變數NAME = ["產品經理","廖波濕"]def qupengfei(): NAME = "自己" print(‘我要搞‘, NAME)qupengfei()# - 無聲明局部變數NAME = ["產品經理","廖波濕"]def qupengfei(): NAME.append(‘XXOO‘) print(‘我要搞‘, NAME)qupengfei()# 如果函數的內容有global關鍵字# - 有聲明局部變數NAME = ["產品經理","廖波濕"]def qupengfei(): global NAME NAME = "自己" print(‘我要搞‘, NAME)qupengfei() # 錯誤樣本, 全部變數放在了局部變數的下面,是不行的;所以,如果要什麼全域變數,就盡量往前放。NAME = ["產品經理","廖波濕"]def qupengfei(): NAME = "自己" global NAME print(‘我要搞‘, NAME) qupengfei()# - 無聲明局部變數NAME = ["產品經理","廖波濕"]def qupengfei(): global NAME NAME = ["阿毛"] NAME.append(‘XXOO‘) print(‘我要搞‘, NAME)qupengfei()
函數裡也可以嵌套函數,執行順序如所示
name=‘海風‘def huangwei(): name = "黃偉" print(name) def liuyang(): name = "劉洋" print(name) def nulige(): name = ‘爐指花‘ print(name) print(name) nulige() liuyang() print(name)huangwei()# 結果黃偉劉洋劉洋爐指花黃偉
name = "剛娘"def weihou(): name = "陳卓" def weiweihou(): global name # global,聲明的是全域變數, name = "冷靜" # 此處修改的是最外層的全域變數,而不是它上一級同名變數 weiweihou() print(name)print(name)weihou()print(name)#結果剛娘陳卓冷靜
name = "剛娘"def weihou(): name = "陳卓" def weiweihou(): nonlocal name # nonlocal,指定上一級變數,如果沒有就繼續往上直到找到為止 name = "冷靜" weiweihou() print(name)print(name)weihou()print(name)# 結果剛娘冷靜剛娘
第十二篇 Python函數之全域變數&局部變數&遞迴函式