最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python函數(shù)的默認(rèn)參數(shù)請勿定義可變類型詳解

 更新時間:2022年02月11日 14:49:46   作者:AML杰  
這篇文章主要介紹了python函數(shù)的默認(rèn)參數(shù)請勿定義可變類型詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

函數(shù)的默認(rèn)參數(shù)請勿定義可變類型

經(jīng)常會看到這樣一句代碼警告:

Default argument value is mutable

意思是告訴我們函數(shù)的定義中,使用可變類型做默認(rèn)參數(shù)。

那為什么會有這個警告呢?

可變類型和不可變類型

  • 可變類型(mutable):列表,字典
  • 不可變類型(unmutable):數(shù)字,字符串,元組

定義可變類型會有什么問題?

def fun(a=[]):
? ? a.append(1)
? ? print(a)
if __name__ == "__main__":
? ? fun()
? ? fun()
>>> [1]
?? ?[1, 1]

可以發(fā)現(xiàn),默認(rèn)參數(shù)定義可變類型之后,在第二次乃至更多次地調(diào)用同一個函數(shù)時,默認(rèn)參數(shù)仿佛失去了效果。

此時,在需要重復(fù)調(diào)用同一個函數(shù)的場景中,就非常容易導(dǎo)致問題,并且該問題不易察覺。在debug的時候就會表現(xiàn)成明明沒有參數(shù)傳進(jìn)來,但是函數(shù)參數(shù)會有值,并且執(zhí)行了不應(yīng)該執(zhí)行的操作。

導(dǎo)致的原因

我的理解:

我們定義的函數(shù)本身是一個function的實(shí)例化對象,每當(dāng)我們進(jìn)行函數(shù)的定義時,就是創(chuàng)建了一個function的實(shí)例化對象,而默認(rèn)參數(shù)就是其屬性。

在沒有傳入?yún)?shù),以默認(rèn)參數(shù)形式調(diào)用,并且改變了函數(shù)對象的屬性值時,改變的屬性值被保存下來,當(dāng)?shù)诙握{(diào)用同一個對象時,屬性值已經(jīng)發(fā)生了改變。

type(fun)
>>> function

解決方法

def fun(a=None):
?? ?if a is None:
?? ?a = []
? ? a.append(1)
? ? print(a)
if __name__ == "__main__":
? ? fun()
? ? fun()
>>> [1]
?? ?[1]

關(guān)于可變類型作為默認(rèn)參數(shù)時的注意點(diǎn)

請先看代碼,看看代碼的輸出是否和你想的一樣。

def e(v,l=[]):
?? ?l.append(v)
?? ?return l
l1=e(10)
l2=e(123,[])
l3=e("a")
print(l1,l2,l3)
# 輸出: ([10, 'a'], [123], [10, 'a'])

關(guān)于上述代碼,標(biāo)準(zhǔn)解釋是:帶有默認(rèn)參數(shù)的表達(dá)式在函數(shù)被定義的時候被計算,不是在調(diào)用的時候計算。

我覺得通俗的解釋是:當(dāng)不傳默認(rèn)值的時候,無論調(diào)用多少次該函數(shù),在函數(shù)體內(nèi)部使用的一直都是那個默認(rèn)的“l”,而這個默認(rèn)的“l”又是可變類型,所以,它的改變會影響所有指向它的變量,也就是l1和l3。

為了使以上兩點(diǎn)的觀點(diǎn)更加站的住腳,我進(jìn)行以下幾個測試。

測試:將可變類型列表換為字典

def e(k,v,d={}):
?? ?d[k]=v
?? ?return d
d1=e(10,10)
d2=e(123,123,{})
d3=e("a","a")
print(d1,d2,d3)
# 輸出:({'a': 'a', 10: 10}, {123: 123}, {'a': 'a', 10: 10})

測試:來個不可變類型字符串

def e(v,s=""):
?? ?s = s+v
?? ?return s
s1=e("我")
s2=e("a","")
s3=e("是")
print(s1,s2,s3)
# 輸出: 我 a 是

其實(shí)以上類型都已經(jīng)說明問題了,但是寫個文章不容易,我決定用元祖包列表,看看修改這個列表中的數(shù)據(jù)會怎樣。

實(shí)際上是不用測試的,最終打印出來的數(shù)據(jù)一定是類似**“可變類型時的操作”**時的輸出的。

為什么?因?yàn)槲覜]有修改元祖本身,修改的是其可變類型列表啊。

不能扯遠(yuǎn)了,不然扯到深拷貝,淺拷貝了。

測試:元祖包個列表來

def e(v,t=([],)): ?# 傳遞有元素的元祖的時候要記得帶逗號哦。
?? ?
?? ?t[0].append(v)
?? ?# t = t[0].append(v) ? ? 要知道t[0].append(v)是沒有返回值的,t會指向None,如果這樣返回,外部打印的全部為None,所以不可以這樣返回。
?? ?# 而且 如果你想 t[0]= t[0].append(v) 也是不行的,為啥?你在ipython中輸入 dir(())你就知道了。
?? ?# 好吧,其實(shí)是因?yàn)樵媸强勺x不可寫的。它能切片、遍歷就已經(jīng)很不錯了。。。。。
?? ?return t
t1=e("我")
t2=e("a",([],))
t3=e("是")
print(t1,"\n",t2,"\n",t3)
# 輸出:
# (['我', '是'],)?
# (['a'],)?
# (['我', '是'],)

小結(jié)一下

家里停電了,所以我來到了網(wǎng)吧,這篇文章是在網(wǎng)吧寫的,用的是python3的在線編輯器,有的地方編碼(比如命名-。-)或者表述的不好請多多見諒。

關(guān)于集合,我就不做測試了,集合一般用于去重和關(guān)系運(yùn)算,它是無序,不重復(fù),可變類型。 

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題

    python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題

    這篇文章主要介紹了python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python繪制七段數(shù)碼管實(shí)例代碼

    Python繪制七段數(shù)碼管實(shí)例代碼

    這篇文章主要介紹了Python繪制七段數(shù)碼管實(shí)例代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 一文帶你了解Python中的type,isinstance和issubclass

    一文帶你了解Python中的type,isinstance和issubclass

    這篇文章主要為大家詳細(xì)介紹了Python中的type、isinstance和issubclass的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • Python中運(yùn)維神器Psutil的用法詳解

    Python中運(yùn)維神器Psutil的用法詳解

    Python的開源庫psutil為我們提供了一個強(qiáng)大的工具,能夠輕松獲取和分析系統(tǒng)利用率的信息,下面就跟隨小編一起深入了解一下它的具體使用吧
    2025-02-02
  • Python使用gRPC實(shí)現(xiàn)數(shù)據(jù)分析能力的共享

    Python使用gRPC實(shí)現(xiàn)數(shù)據(jù)分析能力的共享

    gRPC是一個高性能、開源、通用的遠(yuǎn)程過程調(diào)用(RPC)框架,由Google推出,本文主要介紹了Python如何使用gRPC實(shí)現(xiàn)數(shù)據(jù)分析能力的共享,感興趣的可以了解下
    2024-02-02
  • Django在Model保存前記錄日志實(shí)例

    Django在Model保存前記錄日志實(shí)例

    這篇文章主要介紹了Django在Model保存前記錄日志實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Django中的用戶身份驗(yàn)證示例詳解

    Django中的用戶身份驗(yàn)證示例詳解

    這篇文章主要給大家介紹了關(guān)于Django中用戶身份驗(yàn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SQL Django具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 在Python中字典按值排序的實(shí)現(xiàn)方法

    在Python中字典按值排序的實(shí)現(xiàn)方法

    這篇文章主要介紹了在Python中字典按值排序的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    本篇文章主要介紹了Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • python中有幫助函數(shù)嗎

    python中有幫助函數(shù)嗎

    在本篇文章里小編給大家分享的是一篇關(guān)于python幫助函數(shù)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-06-06

最新評論

靖边县| 常山县| 屏东市| 鄂托克旗| 九台市| 辰溪县| 双流县| 白玉县| 龙川县| 武冈市| 大方县| 长宁县| 临武县| 枣阳市| 太湖县| 桐乡市| 绍兴市| 托里县| 静宁县| 宿迁市| 新宾| 天等县| 浦江县| 土默特右旗| 陕西省| 平江县| 邢台市| 全椒县| 临沧市| 萍乡市| 师宗县| 东丽区| 休宁县| 广宁县| 泸水县| 探索| 营山县| 离岛区| 炎陵县| 四川省| 道孚县|