python中函數形參爲默認列表(或可變數據類型)的情形詳細描述

首先我們來通過一段代碼來解釋函數形參爲默認列表的情形: 

def func(ls = []):
    ls.append(1)
    return ls
a = func()
b = func()
print(a,b)

如上代碼運行的結果爲[1, 1] [1, 1],爲什麼a和b的值都是[1, 1] ?而不是[1] [1,1]呢?

分析:

上面的代碼中函數func的形參爲一個默認參數列表ls,ls爲空的列表,當執行函數a= func()時,將會在系統內存中創建一個列表ls,創建過程如下:

                      

首先 ①、在內存在開闢1個空間保存1個空列表,該空間有自己的編號,在python中可以通過id()函數來查詢該空間的編號【如果不明白id()函數的同學可以百度補習一下】,假設本次程序運行時,空列表的編號爲2083965093768,即id = 2083965093768。而將該空列表賦值給ls時,也是將ls指向id編號,建立一個映射連接。

函數內部執行ls.append(1)之後,空間狀態爲:

                                 

②、函數將結果 ls返回給a時的空間狀態爲:

                                    

可以看出a變量也指向了空間id =  2083965093768的位置。而並不是爲a變量重新開闢一個內存空間,這樣的好處在於大大節約了空間的消耗。

③、當執行第二次函數調用b = func()時,由於ls是一個可變數據類型【可變數據類型:列表list和字典dict;不可變數據類型:整型int、浮點型float、字符串型string和元組tuple。】,再次調用函數時,函數參數傳遞的依舊是id 2083965093768,ls依舊指向該內存空間。再次執行ls.append(1)之後,id =  2083965093768的內存空間裏存儲的列表變成[1,1]。

                                     

此時看到ls,a,b變量都是指向id =  2083965093768的內存空間,而對應空間的內容爲[1,1]。因此最中代碼輸出的結果是[1, 1] [1, 1]。

也可以通過如下代碼來驗證:

def func(ls = []):
    ls.append(1)
    print("ls的id爲:{},ls = {}".format(id(ls),ls))
    return ls
print("第一次調用func()函數:")
a = func()
print("a的id爲:",id(a))
print("第二次調用func()函數:")
b = func()
print("b的id爲:",id(b))
print(a,b)


 

如上代碼添加了一些變量id打印語句。作者運行的結果爲:

第一次調用func()函數:
ls的id爲:2652662843784,ls = [1]
a的id爲: 2652662843784
第二次調用func()函數:
ls的id爲:2652662843784,ls = [1, 1]
b的id爲: 2652662843784
[1, 1] [1, 1]

可以看出打印的id都相同,也驗證瞭如上的說法。

獲取:點擊獲取 計算機二級python全套教學​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章