迭代器意外地增加了自己?

时间:2012-10-15 03:40:31

标签: debugging python-2.7

我在调试此代码摘录时遇到问题。没关系它实际上并没有返回作者想要的东西,我已经解释过,我的问题是不同的。

def factors(n):
    result = []
    for x in xrange(2,n):
        print "\t%i,foo" % x
        if n % x == 0:
            isPrime = True
            print "\t\t%i,bar" % x
            for factor in result:
                print "\t\t%i %% %i = %i" % (x,factor,x % factor)
                if x % factor == 0:
                        isPrime = False
                        print "\t\t\t%i,foobar" % x
                        subFactors = factors(x)
                        result.extend(subFactors)
            if isPrime:
                result.append(x)
print ""
return result

def main():
    factor = dict()
    for i in xrange(1,100):
        factor[i] = factors(i)
        factor[i].insert(0,1)
        factor[i].append(i)
        print "%i: %s" % (i,factor[i])

if __name__ == "__main__":
     main()

该代码无限循环!具体而言,重复输出以下内容:

2,foo
    2,bar
3,foo

    4 % 2 = 0
        4,foobar

请注意,在第二次迭代中,它不会打印“bar”打印语句,并且x的值会从“bar”打印语句更改为“mod”打印语句。

我无法向作者解释这种行为。你们其中一个人可以吗?

1 个答案:

答案 0 :(得分:2)

问题在于,当您对其内容进行迭代时,您正在扩展result列表。以下是两条关键线,没有其他令人分心的位置:

for factor in result:
    result.extend(subFactors)

根据python规范,这有不确定的行为。我很确定这是无限循环的原因。