溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python函數(shù)默認(rèn)參數(shù)使用避坑實例分析

發(fā)布時間:2022-07-22 10:05:43 來源:億速云 閱讀:132 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“python函數(shù)默認(rèn)參數(shù)使用避坑實例分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“python函數(shù)默認(rèn)參數(shù)使用避坑實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

引言

阿刁是一個自動化測試用例,從一出生他就被賦予終生使命,去測試一個叫登錄的過程是否合理。他一直就被關(guān)在一個小黑屋里面,從來也沒有出去過,小黑屋里還被關(guān)著其他的同胞,他們身上都捆著兩個小袋子。

小黑屋里很難受,他們都想跑出去,可怎么也跑不出去。Python 是他們的總司令,有一次,python 告訴他們,你們就不要想著跑出去了,你們已經(jīng)夠幸運(yùn)了,只有 8 個人用這個屋子,別的屋子都擠著 30 多個人呢!

“這里還有其他的屋子?” 一個用例頓時感到很欣喜。

“有,這樣的屋子這里有 200 多個。每個屋子都有門牌號,你們這個門牌是 test_login,你們這個小鎮(zhèn)住的人都很危險,所以通常不允許出去逛。這是你們的小鎮(zhèn)地圖。‘’

python函數(shù)默認(rèn)參數(shù)使用避坑實例分析

“我們哪里危險了。。。” 阿刁很不滿。

Python 微微一笑:“你別不服,看到你們身后的袋子了嗎?這里面裝了炸彈,里面有兩種火藥配方,一個叫 ‘’ 用戶名”,一個叫 “密碼”,你們每個人的配方都不一樣,因此威力也不一樣。你們的工作就是去測試 login 這個堡壘的堅固程度,這樣堡壘真正投入使用的時候,就不怕外面的攻擊了。”

“可我們每天都被關(guān)在屋子里,哪知道怎么去攻擊城堡。”

“這個是個好問題。你們每個人的名字下面我都掛了個錦囊,里面有指令,按照指令做就行了?!?/p>

阿刁低頭一看,還真有指令,他大聲的念了出來:第一條指令是叫 verify 過來幫忙,第二條指令是把炸彈裝到 verify 身上,第三條指令是查看 verify 豎起的旗幟,看是否和自己身上的胎記一樣,如果一樣,就可以下班了;如果不一樣,那就報告 Python。

“咦,我的指令也是一樣的。我的胎記上有一行字,密碼為空。你們的呢?”

“我的也是?!?/p>

"我的是用戶不能為空。"

“我的跟你一樣啊”

阿刁低頭去看自己的胎記 “登錄成功”。這給了他希望,不過他對自己的工作還有些疑惑,他得乘總司令還在的時候問問他:“老大,你的指令寫得非常明確,可我并不認(rèn)識什么 verify,萬一他不過來怎么辦?”,其他人一聽到這個頓時都焦慮起來,是啊,萬一 verify 不來,這炸彈炸到自己了怎么辦?

verify 炸彈

Python 指揮官給了阿刁一個贊賞的眼神,開始講:“大家不要慌,你們看到墻上的按鈕了嗎 “

所有人都紛紛望向墻面,上面有很多按鈕,其中一個印著:

from castles.login import verify

” 雖然你們通常不允許出去,但是別人是可以進(jìn)出的,你們看地圖,verify 是 logi

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

測試接口的數(shù)據(jù)

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

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

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

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

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

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

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

實際結(jié)果為:

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

原因

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

上面兩次調(diào)用中,都沒有傳遞新的實參,程序會調(diào)用定義函數(shù)時保存的默認(rèn)參數(shù),因為 append() , 在第一次調(diào)用以后,默認(rèn)參數(shù)已經(jīng)由 ["孫悟空","李白","甄姬"] 改變?yōu)?nbsp;["孫悟空","李白","甄姬","王昭君"],再次執(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) 為同一個對象,也就是默認(rèn)參數(shù)。如果我們改變 第二個 print(add_element())為 print(add_element(["孫悟空","李白","甄姬"])),那么第 2 個 id(data) 就會發(fā)生變化,因為它不在是默認(rèn)值,而是新傳進(jìn)來的實參,實際結(jié)果也將變成:

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

改進(jìn)方案

  • 如果參數(shù)中有列表,盡量不要用它做默認(rèn)參數(shù)

  • 如果使用了列表作為默認(rèn)參數(shù),函數(shù)調(diào)用時傳入實參,而不是省略

  • 可以在函數(shù)體中另外定義一個變量接收默認(rèn)參數(shù)

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

讀到這里,這篇“python函數(shù)默認(rèn)參數(shù)使用避坑實例分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI