日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Python函數(shù)默認參數(shù)避坑指南

作者:澤澤說測試 更新時間: 2022-07-22 編程語言

列表是一種經(jīng)常使用的數(shù)據(jù)類型。在函數(shù)的定義中,常常會使用列表作為參數(shù)。

比如,要測試一個接口的數(shù)據(jù),接口返回的數(shù)據(jù)格式如下:

{
  "code": "20000", 
  "data": ["孫悟空","李白","甄姬"], 
  "msg": "success", 
  "status": 0
}

要測試的內(nèi)容是:返回的 data 數(shù)據(jù)是否跟需求符合。在測試之前,需要對數(shù)據(jù)進一步處理,比如要增加 “王昭君” 這個元素進去,需要寫一個函數(shù):

def add_element(data=["孫悟空","李白","甄姬"]):
    data.append('王昭君')
    return data

print(add_element())
print(add_element())
print(add_element())

在函數(shù)定義的時候經(jīng)常會給參數(shù)設置默認值,在這個例子中,將 data 參數(shù)設置了默認值,函數(shù)定義以后,后面會被頻繁的調(diào)用,期望值應該是打印如下:

["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君"]

實際結(jié)果為:

["孫悟空","李白","甄姬","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君"]
["孫悟空","李白","甄姬","王昭君","王昭君","王昭君"]

原因

當定義函數(shù)時,會保存函數(shù)中默認參數(shù) data 的值,也就是 ["孫悟空","李白","甄姬"],在每次調(diào)用的時候如果傳遞了新的實參,則使用傳遞的參數(shù);沒有傳遞,使用定義函數(shù)時保存的默認參數(shù)。

上面兩次調(diào)用中,都沒有傳遞新的實參,程序會調(diào)用定義函數(shù)時保存的默認參數(shù),因為 append() , 在第一次調(diào)用以后,默認參數(shù)已經(jīng)由 ["孫悟空","李白","甄姬"] 改變?yōu)?["孫悟空","李白","甄姬","王昭君"],再次執(zhí)行 append() 之后,就變成了 ["孫悟空","李白","甄姬","王昭君","王昭君"];同理,第三次又改變了。

可以使用 id() 函數(shù)來定位問題:

def add_element(data=["孫悟空","李白","甄姬"]):
    # id 來表示是不是同一個對象
	print(id(data))
    data.append('王昭君')
    return data

print(add_element())
print(add_element())
print(add_element())

打印出來的 id(data) 為同一個對象,也就是默認參數(shù)。如果我們改變 第二個 print(add_element()) print(add_element(["孫悟空","李白","甄姬"])),那么第 2 個 id(data) 就會發(fā)生變化,因為它不在是默認值,而是新傳進來的實參,實際結(jié)果也將變成:

2543416926792
['孫悟空', '李白', '甄姬', '王昭君']
2543418907848
["孫悟空","李白","甄姬", '王昭君']
2543416926792
['孫悟空', '李白', '甄姬', '王昭君', '王昭君']

改進方案

  • 如果參數(shù)中有列表,盡量不要用它做默認參數(shù)
  • 如果使用了列表作為默認參數(shù),函數(shù)調(diào)用時傳入實參,而不是省略
  • 可以在函數(shù)體中另外定義一個變量接收默認參數(shù)
def add_element(data=["孫悟空","李白","甄姬"]):
    if data == ["孫悟空","李白","甄姬"]:
        data = ["孫悟空","李白","甄姬"]
    data.append('王昭君')
    return data

我是九柄,公眾號【 九柄 】,分享軟件測試文章、面試、教程資料,歡迎來看看。

原文鏈接:https://blog.csdn.net/looker53/article/details/125896673

欄目分類
最近更新