【问题标题】:Clear a list in a function each time it's run每次运行时清除函数中的列表
【发布时间】:2013-05-18 12:54:08
【问题描述】:

我对编程有点陌生。我正在尝试在 python 中编写一个算法,它给出一个数字的所有主要因素:

factors=[]
def factor(n):
    for i in range(2,n+1):
        if n%i==0:
            factors.append(i)
            factor(int(n/i))
            break
    return factors

它可以工作,但是每当我再次运行“因素”函数时,它只会附加到已经填充的“因素”列表中 - 如何在每次运行“因素”函数时清除列表?

【问题讨论】:

  • 太糟糕了,上面的“清除 Python 列表”链接将其标记为已回答。有些人在不阅读问题的情况下根据标题标记重复项。这显然是一个不同的问题......恕我直言

标签: python list


【解决方案1】:

在函数内部声明一个局部变量。在您的代码中,您实际上是在每次调用 factor() 时修改全局变量 factors

def factor(n, factors=None):
    factors = [] if factors is None else factors 
    for i in range(2, n + 1):
        if n%i==0 and i not in factors: #checks for duplicates as well
            factors.append(i)
            factor(int(n / i),factors) #pass the factors list in the recurive call
            break
    return factors

factor(20) #returns [2, 5]

【讨论】:

  • 谢谢 - 我去了这是我的最终结果: def factor(n,factors=None): factor=[] if factor is None else factor for i in range(2,n+1): if n%i==0: factor.append(i) factor(int(n/i),factors) 打破返回因子,因为我想要所有素因子,包括重复项 - 但感谢您的帮助!
  • 万一出现递归怎么办?
【解决方案2】:

@ashwini-chaudhary 有一个很好的答案,它是我最常用的成语。 OP 提出了一个笼统的问题,所以我将提供一个修改后的解决方案,它使用 python 闭包来做同样的事情。

它长了两行(一行声明一个内部函数,另一行调用它)并且可能对某些人来说“丑陋”,但它的优点是不向调用者不应该看到或使用的原始函数添加参数,并且在每次递归时不调用条件赋值。

def factor2(n):
    factors = []
    def fact(n):
        for i in range(2, n + 1):
            if n%i==0 and i not in factors: #checks for duplicates as well
                factors.append(i)
                factor(int(n / i),factors) #pass the factors list in the recurive call
                break
    fact(n)
    return factors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2021-10-23
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    相关资源
    最近更新 更多