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

2024-10-01 02:25:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用递归函数编写字符串匹配程序。函数首先创建一个名为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"))

Tags: key函数字符串程序target列表lenreturn
3条回答

当您使用可变对象作为默认值时,会出现混淆。这里,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)

解决办法是:

def foo(x=None):
    if x is None:
        x = []
    # do stuff

你可以在这里阅读更多http://effbot.org/zone/default-values.htm

因为默认值是对默认值的引用,所以不会每次都创建它。 因此,如果您运行这样的示例:

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]

这样就行了

相关问题 更多 >