溫馨提示×

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

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

python默認(rèn)參數(shù)不生效的解決方法

發(fā)布時(shí)間:2020-09-01 10:30:01 來(lái)源:億速云 閱讀:451 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹python默認(rèn)參數(shù)不生效的解決方法,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

默認(rèn)參數(shù)很有用,但使用不當(dāng),也會(huì)掉坑里。默認(rèn)參數(shù)有個(gè)最大的坑,演示如下:

先定義一個(gè)函數(shù),傳入一個(gè)list,添加一個(gè)END再返回:

def add_end(L=[]):
    L.append('END')
    return L

當(dāng)你正常調(diào)用時(shí),結(jié)果似乎不錯(cuò):

>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']

當(dāng)你使用默認(rèn)參數(shù)調(diào)用時(shí),一開始結(jié)果也是對(duì)的:

>>> add_end()
['END']

但是,再次調(diào)用add_end()時(shí),結(jié)果就不對(duì)了:

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

很多初學(xué)者很疑惑,默認(rèn)參數(shù)是[],但是函數(shù)似乎每次都“記住了”上次添加了'END'后的list。

原因解釋如下:

Python函數(shù)在定義的時(shí)候,默認(rèn)參數(shù)L的值就被計(jì)算出來(lái)了,即[],因?yàn)槟J(rèn)參數(shù)L也是一個(gè)變量,它指向?qū)ο骩],每次調(diào)用該函數(shù),如果改變了L的內(nèi)容,則下次調(diào)用時(shí),默認(rèn)參數(shù)的內(nèi)容就變了,不再是函數(shù)定義時(shí)的[]了。

所以,定義默認(rèn)參數(shù)要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不變對(duì)象!

要修改上面的例子,我們可以用None這個(gè)不變對(duì)象來(lái)實(shí)現(xiàn):

def add_end(L=None):
if L is None:
L = []
L.append('END')
return L

現(xiàn)在,無(wú)論調(diào)用多少次,都不會(huì)有問(wèn)題:

>>> add_end()
['END']
>>> add_end()
['END']

為什么要設(shè)計(jì)str、None這樣的不變對(duì)象呢?因?yàn)椴蛔儗?duì)象一旦創(chuàng)建,對(duì)象內(nèi)部的數(shù)據(jù)就不能修改,這樣就減少了由于修改數(shù)據(jù)導(dǎo)致的錯(cuò)誤。此外,由于對(duì)象不變,多任務(wù)環(huán)境下同時(shí)讀取對(duì)象不需要加鎖,同時(shí)讀一點(diǎn)問(wèn)題都沒(méi)有。我們?cè)诰帉懗绦驎r(shí),如果可以設(shè)計(jì)一個(gè)不變對(duì)象,那就盡量設(shè)計(jì)成不變對(duì)象。

以上是python默認(rèn)參數(shù)不生效的解決方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

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

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

AI