Python 函数,如果可以通过添加数字数组中的数字来实现targetSum,则返回布尔值

Python 函数,如果可以通过添加数字数组中的数字来实现targetSum,则返回布尔值,python,dictionary,compiler-errors,runtime-error,dynamic-programming,Python,Dictionary,Compiler Errors,Runtime Error,Dynamic Programming,代码:- def canSum(targetSum,数字,d={}): 如果d.keys()中的targetSum: 返回d[目标金额] 如果targetSum==0: 返回真值 如果targetSum的签名,请考虑定义一个包装器,它将 d={} /代码>放入递归函数的调用中。 阅读更多信息:因此,我得到的是——当我第二次调用该函数时,字典(d)不是空的,它包含了上一次运行时的一些(键、值)对。我说得对吗@阿迪斯。函数定义中定义的d的默认字典与函数对象关联,并在调用之间共享。 def canSu

代码:-

def canSum(targetSum,数字,d={}):
如果d.keys()中的targetSum:
返回d[目标金额]
如果targetSum==0:
返回真值
如果targetSum<0:
返回错误
对于每个数字:
rem=目标总和-每个
如果可以求和(rem、数字、d):
d[targetSum]=真
返回真值
d[targetSum]=假
返回错误
我的问题-
当我为testcase-print(canSum(7,[2,4])运行上述代码时,它返回false(这是正确的)。但是,当我为两个测试用例——print(canSum(7,[3,5,4])和print(canSum(7,[2,4])运行相同的代码时,这两个测试用例都返回true!(这是错误的)


我不知道发生了什么事。代码有问题吗?帮帮我。

问题在于
d
的可变默认参数

[]
&
{}
这样的可变默认值与函数关联,而不是该函数的特定调用。因此,它将状态从一个调用传递到另一个调用。这就是为什么如果多次运行代码就会失败。简单地说,
d
第二次不是空的

您甚至不需要
d={}
。如果您删除了它,您的代码就可以正常工作

def canSum(targetSum, numbers, d={}):
    if targetSum in d.keys():
        return d[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False
    for each in numbers:
        rem = targetSum - each
        if canSum(rem, numbers, d):
            d[targetSum] = True
            return True
    d[targetSum] = False
    return False

如果您必须保留<代码> ChanSuth/Cube >的签名,请考虑定义一个包装器,它将<代码> d={} /代码>放入递归函数的调用中。


阅读更多信息:

因此,我得到的是——当我第二次调用该函数时,字典(d)不是空的,它包含了上一次运行时的一些(键、值)对。我说得对吗@阿迪斯。函数定义中定义的
d
的默认字典与函数对象关联,并在调用之间共享。
def canSum(targetSum, numbers, d):
    if targetSum in d.keys():
        return d[targetSum]
    if targetSum == 0:
        return True
    if targetSum < 0:
        return False
    for each in numbers:
        rem = targetSum - each
        if canSum(rem, numbers, d):
            d[targetSum] = True
            return True
    d[targetSum] = False
    return False

print(canSum(7, [2, 4], {}))
print(canSum(7, [3,5,4], {}))
False
True