首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复调用python函数时会返回不同的结果

重复调用python函数时会返回不同的结果
EN

Stack Overflow用户
提问于 2013-07-10 04:27:25
回答 4查看 692关注 0票数 4

当我运行下面的python代码时,

代码语言:javascript
复制
def main():
    #print prime_factors(10)
    print prime_factors(9)

def prime_factors(n, i=2, factors=[]):
    if n==1:
        return factors
    if(n%i==0):
        factors.append(i)
        n = n/i
        return prime_factors(n, i, factors)
    else:
        return prime_factors(n, i+1, factors)

if __name__ == '__main__':
    main()

它返回预期结果,它返回9的质因数:

代码语言:javascript
复制
[3, 3]

如果我删除第2行"print prime_factors(10)“中的注释,就会发生一些奇怪的事情。对于10,一切都很好,但对于9,它不仅包含9的质因数,而且还包含10的质因数:

代码语言:javascript
复制
[2, 5]
[2, 5, 3, 3]

如果我使用两个可选参数调用函数

代码语言:javascript
复制
def main():
    print prime_factors(10, i=2, factors[])
    print prime_factors(9, i=2, factors[])

一切都很好。

代码语言:javascript
复制
[2,5]
[3,3]

我不知道为什么。我怀疑这是作用域的一些问题,但我就是不明白:-(任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2013-07-10 04:28:49

为函数参数定义的默认值是“粘性的”--它们属于函数体本身,因此当您修改它们时,它们会被修改以备下次调用。

票数 7
EN

Stack Overflow用户

发布于 2013-07-10 04:29:55

这是因为factors是一个可变的默认参数。名为factors的新列表仅计算一次,因此,如果您更改该列表,则会在后续调用中获得更改后的列表。请参阅以下代码片段-

代码语言:javascript
复制
>>> def test(a = []):
        a.append('x')
        return a

>>> test()
['x']
>>> test()
['x', 'x']

尝试将其初始化为None,然后检查None,并在函数体中分配一个空列表。

代码语言:javascript
复制
>>> def test(a = None):
        if a is None:
            a = []
        a.append('x')
        return a

>>> test()
['x']
>>> test()
['x']
票数 4
EN

Stack Overflow用户

发布于 2013-07-10 04:30:20

在函数参数中使用factors=[]作为默认值不是一个好主意。Python在第一次遇到函数定义时只对[]表达式求值一次。基本上,这意味着您对prime_factors的所有调用都将使用相同的列表,并且每个调用都将附加其自己的值。

例如:

代码语言:javascript
复制
prime_factors(9)
prime_factors(9)
prime_factors(9)

将会返回

代码语言:javascript
复制
[3,3,3,3,3,3]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17557570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档