1. 程式人生 > >09: python基礎查漏補缺

09: python基礎查漏補缺

技術 color opened pre python2 特點 返回值 none 一個

1.1 閉包

  1、閉包概念

      1. 在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用,這樣就構成了一個閉包

      2. 一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。

      3. 但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然後自己再結束。

  2、閉包特點    

      1. 必須有一個內嵌函數

      2. 內嵌函數必須引用外部函數中的變量

      3. 外部函數的返回值必須是內嵌函數

技術分享圖片
#閉包函數的實例
def outer( a ):
    b = 10
    def inner():          # 在內函數中 用到了外函數的臨時變量
        print(a+b)        # 外函數的返回值是內函數的引用
    return inner

if __name__ == __main__:
    demo = outer(5)
    demo()    # 15

# 在這裏我們調用外函數傳入參數5
# 此時外函數兩個臨時變量 a是5 b是10 ,並創建了內函數,然後把內函數的引用返回存給了demo
# 外函數結束的時候發現內部函數將會用到自己的臨時變量,這兩個臨時變量就不會釋放,會綁定給這個內部函數
# 我們調用內部函數,看一看內部函數是不是能使用外部函數的臨時變量 # demo存了外函數的返回值,也就是inner函數的引用,這裏相當於執行inner函數
閉包實例

  3、閉包中內函數修改外函數局部變量

    1、在基本的python語法當中,一個函數可以隨意讀取全局數據,但是要修改全局數據的時候有兩種方法:
        1) global 聲明全局變量
        2) 全局變量是可變類型數據的時候可以修改
    2、在閉包情況下使用下面兩種方法修改
        1)在python3中,可以用nonlocal 關鍵字聲明 一個變量, 表示這個變量不是局部變量空間的變量,需要向上一層變量空間找這個變量。
        2)在python2中,沒有nonlocal這個關鍵字,我們可以把閉包變量改成可變類型數據進行修改,比如列表。

技術分享圖片
#修改閉包變量的實例
def outer( a ):
    b = 10            # a和b都是閉包變量
    c = [a]           # 這裏對應修改閉包變量的方法2
    def inner():
        # 方法一: nonlocal關鍵字聲明(python3)
        nonlocal  b
        b+=1

        # 方法二: 把閉包變量修改成可變數據類型 比如列表(python2)
        c[0] += 1
        print(c[0])
        print(b)
    return inner         # 外函數的返回值是內函數的引用

if __name__ == __main__:
    demo = outer(5)
    demo()             # 6  11
閉包中內函數修改外函數局部變量

1.2 Python裏的拷貝

09: python基礎查漏補缺