为了账号安全,请及时绑定邮箱和手机立即绑定

为什么函数不使用默认值?

为什么函数不使用默认值?

绝地无双 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 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号