亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

當(dāng)心Python函數(shù)可變默認(rèn)參數(shù)(list,set,dict…)的陷阱

Integ / 465人閱讀

摘要:下面我們看看使用可變默認(rèn)參數(shù)時(shí)會(huì)出現(xiàn)什么莫名其妙的狀況。這就意味著如果你使用可變默認(rèn)參數(shù)并改變它,所有調(diào)用該函數(shù)的結(jié)果都是這個(gè)可變對(duì)象。同時(shí)也有注意,該函數(shù)要傳遞一個(gè)對(duì)象作為第二個(gè)參數(shù),因?yàn)楹瘮?shù)中對(duì)它進(jìn)行了操作。

絕大多數(shù)情況下,Python是一個(gè)干凈具有一致性的語言。然而,有些少數(shù)情況會(huì)讓初學(xué)者感到困惑。其中有些情況是有意識(shí)的但會(huì)成為潛在的莫名其妙,而有些可以說是語言贅肉。下面我們看看使用可變默認(rèn)參數(shù)(Mutable default arguments)時(shí)會(huì)出現(xiàn)什么莫名其妙的狀況。

你可能寫了以下函數(shù),它有一個(gè)默認(rèn)參數(shù)是一個(gè)list:

def append_to(element, to=[]):
    to.append(element)
    return to

然后調(diào)用該函數(shù):

my_list = append_to(12)
print(my_list)

my_other_list = append_to(42)
print(my_other_list)
A new list is created each time the function is called if a second argument isn’t provided, so that the output is:

每次調(diào)用該函數(shù),如果第二個(gè)參數(shù)沒有提供(使用默認(rèn)參數(shù)),一個(gè)新的list將會(huì)生成,所以輸出應(yīng)該是:

[12]
[42]

但是,結(jié)果并非上面那樣,而是下面這樣:

[12]
[12, 42]

當(dāng)該函數(shù)被定義時(shí),一次性生成一個(gè)list作為默認(rèn)參數(shù),后面每次成功調(diào)用都是使用的第一次生成的那個(gè)list。

Python的默認(rèn)參數(shù)只在函數(shù)被定義時(shí)生成一次,而非每次調(diào)用時(shí)生成。這就意味著如果你使用可變默認(rèn)參數(shù)并改變它,所有調(diào)用該函數(shù)的結(jié)果都是這個(gè)可變對(duì)象。

正確的做法應(yīng)該是:

讓默認(rèn)參數(shù)為None(None通常是一個(gè)很好的選擇),每次調(diào)用時(shí)創(chuàng)建一個(gè)新對(duì)象。

def append_to(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to


同時(shí)也有注意,該函數(shù)要傳遞一個(gè)list對(duì)象作為第二個(gè)參數(shù),因?yàn)楹瘮?shù)中對(duì)它進(jìn)行了append操作。

文章都是我過往經(jīng)驗(yàn)總結(jié),我在我的博客:https://www.yuanrenxue.com/ 和 公眾號(hào)【猿人學(xué)Python】 上會(huì)分享更多心得體會(huì)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/43644.html

相關(guān)文章

  • 流暢python

    摘要:流暢的中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用標(biāo)準(zhǔn)庫。常見的扁平序列包括,,等。數(shù)組支持所有跟可變序列有關(guān)的操作,包括和。和用于指定列表的區(qū)間,默認(rèn)是使用整個(gè)列表。但是元組的賦值不被允許,當(dāng)異發(fā)生時(shí) 流暢的python中有很多奇技淫巧,整本書都在強(qiáng)調(diào)如何最大限度地利用Python 標(biāo)準(zhǔn)庫。介紹了很多python的不常用的數(shù)據(jù)類型、操作、庫等,對(duì)于入門python后想要提升對(duì)p...

    Alan 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記]Python基本語法之dict,set

    摘要:如果一個(gè)對(duì)象定義了和兩個(gè)方法,它就是一個(gè)迭代器,對(duì)于迭代器來說,返回的是它自身,則是返回迭代器中的下一個(gè)值。 復(fù)習(xí)索引: 1. dict與list的區(qū)別是什么?查找方面 2. dict如何進(jìn)行數(shù)據(jù)的存、取、判斷是否存在、返回位置、刪除等操作? 3. 什么是不可變對(duì)象?在dict和set中如何應(yīng)用? 4. dict和set有什么異同? 5. range(),abx()函數(shù)如何使用?參數(shù)是...

    AZmake 評(píng)論0 收藏0
  • Python_基礎(chǔ)

    摘要:依次寫出函數(shù)名括號(hào)參數(shù)語句結(jié)束符。使用和是的習(xí)慣寫法,當(dāng)然也可以用其他參數(shù)名,但最好使用習(xí)慣用法。命名的關(guān)鍵字參數(shù)作用為了限制調(diào)用者可以傳入的參數(shù)名,同時(shí)可以提供默認(rèn)值。 Run 源代碼 Python源代碼的文件以py為擴(kuò)展名,由Python程序解釋,不需要編譯 命令:python 文件 字節(jié)代碼 Python源文件經(jīng)過編譯后生成的擴(kuò)展名為pyc的文件編譯方法: import py_c...

    mindwind 評(píng)論0 收藏0
  • Python - 函數(shù)參數(shù)

    摘要:調(diào)用函數(shù)時(shí),必須傳入且傳入的兩個(gè)值按照位置順序依次賦給參數(shù)和,若缺省,則會(huì)報(bào)錯(cuò)。例如二默認(rèn)參數(shù)在函數(shù)定義中,為參數(shù)預(yù)先定義默認(rèn)值。執(zhí)行相當(dāng)于調(diào)用如果要求的四次方,則需要執(zhí)行設(shè)置默認(rèn)參數(shù)的好處默認(rèn)參數(shù)可以簡化函數(shù)的調(diào)用,降低調(diào)用函數(shù)的難度。 題外話:因?yàn)闀r(shí)間關(guān)系,沒能保持一定的更新頻率。但還是會(huì)一直堅(jiān)持的~ 之前介紹了Python函數(shù)的定義,今天分享一下Python函數(shù)的參數(shù)吧!內(nèi)容會(huì)...

    APICloud 評(píng)論0 收藏0
  • Python對(duì)象引用、可變性和垃圾回收

    摘要:一對(duì)象引用基礎(chǔ)知識(shí)變量是標(biāo)注而不是容器。也就是說元組中不可變的是元素的標(biāo)識(shí),但元組的值會(huì)隨著引用的可變對(duì)象變化而變化。在中每個(gè)對(duì)象的引用都會(huì)有統(tǒng)計(jì)。弱引用不會(huì)妨礙對(duì)象被當(dāng)做垃圾回收。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、明確變量保存的是引用這一本質(zhì);2、熟悉對(duì)象引用的基礎(chǔ)知識(shí);...

    ytwman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<