亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么函數不使用默認值?

為什么函數不使用默認值?

絕地無雙 2022-09-20 17:57:41
我試圖使用遞歸函數編寫字符串匹配程序。該函數首先創建一個名為 tuple1 的空列表來添加點。然后它返回列表。但是,當我嘗試兩次使用此函數時,該函數會將點添加到在上一個函數中創建的列表。為什么函數在第二次調用中不使用默認值 tuple1 = []?任何想法??程序輸出:[0, 3, 5, 9, 11, 12, 15, 19][0, 3, 5, 9, 11, 12, 15, 19, 0, 5, 15]順便說一句,這是麻省理工學院共享的開放課件的作業。def subStringMatchExact(target, key, counter=0, tuple1=[]):    if len(target) < len(key):       return tuple1    else:       counter += 1       if target[:len(key)] == key:          tuple1.append(counter-1)       return subStringMatchExact(target[1:], key, counter, tuple1)print(subStringMatchExact("atgacatgcacaagtatgcat", "a"))print(subStringMatchExact("atgacatgcacaagtatgcat", "atg"))
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

解決方法是:


def foo(x=None):

    if x is None:

        x = []

    # do stuff

您可以在此處閱讀更多內容 http://effbot.org/zone/default-values.htm


查看完整回答
反對 回復 2022-09-20
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

由于默認值是對默認值的引用,因此并非每次都創建默認值。因此,如果您運行這樣的示例:


def f(x=[]):

    x.append(1)

    return x

print(f()) #prints [1]

print(f()) #prints [1,1]

解決方法是使用不可變的元組并將其轉換為列表:


def f(x=()):

    if not isinstance(x, list):

        input = list(x)

    else:

        input = x

    input.append(1)

    return input

print(f()) #[1]

print(f()) #[1]

這樣它就可以工作了


查看完整回答
反對 回復 2022-09-20
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

當您使用可變對象作為默認值時,這里會出現混淆。在這里,tuple1 只是在每次調用函數時添加到列表中。以下是一個解決方法:


def subStringMatchExact(target, key, counter=0, tuple1=None):

    if tuple1 == None:

        tuple1 = []

    if len(target) < len(key):

       return tuple1


    else:

       counter += 1


       if target[:len(key)] == key:

          tuple1.append(counter-1)

       return subStringMatchExact(target[1:], key, counter, tuple1)


查看完整回答
反對 回復 2022-09-20
  • 3 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號