3 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
我不知道這是否是它背后的想法,但是處理的簡(jiǎn)便性(即list使用tuple數(shù)據(jù)實(shí)例化 a并不難)可能會(huì)出現(xiàn)令人困惑的行為。
def fce1(*args):
fce2(args)
# some more code using args
def fce2(args):
args.insert(0, 'other_val')
fce1(1, 2, 3)
編寫(xiě)fce1代碼的人可能會(huì)感到驚訝,因?yàn)閍rgs他們沒(méi)有意識(shí)到他們稍后處理的不是調(diào)用函數(shù)的內(nèi)容。
我還認(rèn)為不可變類型在內(nèi)部更容易處理并且開(kāi)銷更少。

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
我最好的猜測(cè)是,如果 *args 生成一個(gè)列表(可變),它會(huì)在多種情況下導(dǎo)致非常令人驚訝的結(jié)果。@Ondrej K. 給出了一個(gè)很好的例子。打個(gè)比方,當(dāng)有一個(gè)列表作為默認(rèn)參數(shù)時(shí),每個(gè)函數(shù)調(diào)用可能有不同的默認(rèn)參數(shù)。這是默認(rèn)參數(shù)只計(jì)算一次的結(jié)果,這種情況不是最直觀的。即使是官方的 python 文檔也有針對(duì)這種情況的特定解決方法。
執(zhí)行函數(shù)定義時(shí)從左到右計(jì)算默認(rèn)參數(shù)值。這意味著表達(dá)式會(huì)在定義函數(shù)時(shí)計(jì)算一次,并且每次調(diào)用都使用相同的“預(yù)計(jì)算”值。這對(duì)于理解何時(shí)默認(rèn)參數(shù)是可變對(duì)象(例如列表或字典)尤其重要:如果函數(shù)修改了對(duì)象(例如,通過(guò)將項(xiàng)目附加到列表),則默認(rèn)值實(shí)際上被修改了。這通常不是預(yù)期的。解決這個(gè)問(wèn)題的一種方法是使用 None 作為默認(rèn)值,并在函數(shù)體中明確測(cè)試它,例如:
def whats_on_the_telly(penguin=None):
if penguin is None:
penguin = []
penguin.append("property of the zoo")
return penguin
總而言之,我認(rèn)為 *args 是一個(gè)元組,因?yàn)閷⑺鳛榱斜頃?huì)導(dǎo)致與可變類型相關(guān)的所有問(wèn)題(如速度較慢),更大的問(wèn)題是大多數(shù)人不希望函數(shù)參數(shù)發(fā)生變化。盡管我確實(shí)同意這種實(shí)現(xiàn)與PEP-3132非常不一致,并且會(huì)導(dǎo)致大多數(shù)學(xué)習(xí)者感到困惑。我對(duì) Python 非常陌生,為了與PEP-3132 的接受保持一致,我花了一段時(shí)間才理解 *args 成為元組而不是列表的原因可能是什么。

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
為什么不?關(guān)于元組的事情是,你不能在創(chuàng)建后改變它。這允許提高執(zhí)行腳本的速度,并且您實(shí)際上不需要函數(shù)參數(shù)列表,因?yàn)槟鷮?shí)際上不需要修改函數(shù)的給定參數(shù)。你需要為你的參數(shù)附加或刪除方法嗎?在大多數(shù)情況下,它不會(huì)。你想讓你的程序運(yùn)行得更快嗎?那會(huì)是的。這就是大多數(shù)人喜歡擁有東西的方式。*args 的東西因此返回元組,如果你真的需要一個(gè)列表,你可以用一行代碼來(lái)轉(zhuǎn)換它!
args = list(args)
所以總的來(lái)說(shuō):它可以加快您的程序執(zhí)行速度。你不要改變論據(jù)。改變它的類型并不難。
添加回答
舉報(bào)