1. 程式人生 > >第十二篇 Python函數之全局變量&局部變量&遞歸函數

第十二篇 Python函數之全局變量&局部變量&遞歸函數

量變 錯誤 總結 bsp code 類型 hang qup 說明

全局變量:在定義的時候,頂頭寫的,沒有任何縮進的變量就是全局變量。

全局變量的特點:在當前文件裏的任何地方都可以進行調用

局部變量:在子程序裏定義的變量,就是局部變量。

子程序:比如.py文件裏,寫的函數就是個子程序。而這個函數裏定義的變量就是局部變量

示例:全局變量

# 全局變量
name=alex  

def change_name():
    print(change_name,name)  # 調用了全局變量

change_name()
# 結果
change_name alex

print(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函數之全局變量&局部變量&遞歸函數