2012-10-15 42 views
0

我在调试此代码片段时遇到问题。不要紧,它实际上并没有回报作者想要的东西,我已经解释说,我的问题是不同的。迭代器意外增加自己?

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 

注意,在第二次迭代它不打印“栏中的”打印语句,以及x变化从“栏中的” print语句“国防部”的价值打印声明。

我无法向作者解释此行为。你们中的一个人能够善待人吗?

回答

2

问题是,当您迭代其内容时,您正在扩展result列表。这里有两个关键的线条,没有他们周围的其他干扰位:

for factor in result: 
    result.extend(subFactors) 

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

+0

这是否也可以解释为什么“酒吧”级别的打印语句不会第二次出现? – rsegal

+0

也许。由于递归,“foo”位被重复,而由于扩展列表,“foo”位被重复。我怀疑修正是完全忽略非主要因素,因为您将始终在外循环的上一个循环中添加其所有子因子。 – Blckknght