python函數中把列表(list)當參數時的"入坑"與"出坑"

來源:互聯網
上載者:User

標籤:for   參數   bsp   []   結果   not   不為   str   沒有   

在Python函數中,傳遞的參數如果預設有一個為 列表(list),那麼就要注意了,此處有坑!!

入坑
def f(x,li=[]):    for i in range(x):        li.append(i*i)    print(li) print(‘---1---‘)f(4)print(‘---2---‘)f(5)
預期結果
---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 16]
執行結果
---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 0, 1, 4, 9, 16]
出坑

當定義函數時,會儲存函數中預設參數 list 的值,也就是列表 li=[];

在每次調用的時候如果傳遞了新的列表,則使用傳遞的列表,沒有傳遞,使用定義函數時儲存的預設參數(li=[]);

上面兩次調用中,都沒有傳遞新的列表(使用預設列表 li=[] ),程式會調用定義函數時儲存的預設參數((li=[]));

列表在append的時候會在 li=[] 原來的基礎上append追加值,所以會產生以上結果.

通過列印列表的ID進行辨識

列印列表 li=[] 的ID:

def f(x,li=[]):    print(id(li))  # 添加列印id    for i in range(x):        li.append(i*i)    print(li)  print(‘---1---‘)f(4)print(‘---2---‘)f(5)

結果:

---1---140306123906248[0, 1, 4, 9]---2---140306123906248[0, 1, 4, 9, 0, 1, 4, 9, 16]

會發現ID值是相同的;

說明兩次執行時使用的都是定義函數時的預設參數 li=[ ]

執行時往裡面傳新的列表

列印列表 li=[] 的ID 和 傳的新列表的ID:

def f(x,li=[]):    print(id(li))    for i in range(x):        li.append(i*i)    print(li)  print(‘---1---‘)f(4)print(‘---2---‘)f(5,[])print(‘---3---‘)f(6)

結果:

---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 16]---3---[0, 1, 4, 9, 0, 1, 4, 9, 16, 25]

會發現執行傳遞空(新)列表的函數時列印的ID不一樣,而沒有傳遞的一樣;

當傳遞空列表時,函數體當中會使用傳遞的空列表,沒有傳遞時,使用函數預設值 li=[ ], 所以會產生以上結果。

最佳化

如果想要達到預期的結果,只需要在函數體裡進行判斷即可:

def f(x, li=[]):    if not li:        # 如果li不為空白的話,就往下走(清空列表); 為空白就不走        li = []    for i in range(x):        li.append(i * i)    print(li)print(‘---1---‘)f(4)print(‘---2---‘)f(5)print(‘---3---‘)f(6)

結果:

---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 16]---3---[0, 1, 4, 9, 16, 25]

 

python函數中把列表(list)當參數時的"入坑"與"出坑"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.