2016-01-24 147 views
0

我想打印我的程序制作的步骤,并将这些步骤放入列表中。但我无法弄清楚为什么我的代码打印错误的输出。我是编程新手,我希望somoene能够提供帮助。这是我的代码:打印递归步骤

r=[] 
listOfsteps = [] 
j = 0 

class Main(object): 
    def __init__(self): 
     i=0 
     while i != 1: 
      self.method(r, j) 
      i+=1 

    def method(self, r, j): 

     r.append(j) 
     listOfsteps.append(r) 
     j+=1 
     if j ==5: 
      return "stop" 
     print r 
     print "ListOfSteps", listOfsteps 
     return self.method(r, j) 

Main() 

现在输出:

[0] 
ListOfSteps [[0]] 
[0, 1] 
ListOfSteps [[0, 1], [0, 1]] 
[0, 1, 2] 
ListOfSteps [[0, 1, 2], [0, 1, 2], [0, 1, 2]] 
[0, 1, 2, 3] 
ListOfSteps [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]] 

输出,我想:

[0] 
ListOfSteps [[0]] 
[0, 1] 
ListOfSteps [[0], [0, 1]] 
[0, 1, 2] 
ListOfSteps [[0], [0, 1], [0, 1, 2]] 
[0, 1, 2, 3] 
ListOfSteps [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]] 
+0

'listOfsteps'是一个列表,其中包含与*相同的r *列表的多个参考。所以当你修改'r'时,'listOfsteps'中的每个元素都会被更新,因为它们都是相同的列表。 –

回答

3

用途:

listOfsteps.append(list(r)) 

相反的:

listOfsteps.append(r) 

在您的版本中,您追加了对r的引用,并在下一次迭代中更改r,以便您存储的引用受到影响。你需要复制你想追加的列表。

您也可以使用copy这样做。

+0

谢谢您的主席:) –

+0

@ L.B如果Pawel的答案回答了您的问题,请将其标记为已接受,以便可能面临类似问题的其他用户知道哪些方面有效。 –

0
r=[] 
listOfsteps = [] 
j = 0 

class Main(object): 

def __init__(self): 
     #you don't need loop while for your example 
     self.method(r, j) 

    def method(self, r, j): 

     r.append(j) 
     # append only the steps index 
     #you don't need to add whole list for every step 
     listOfsteps.append(j) 
     j+=1 
     if j == 5: 
      return "stop" 
     print r 
     #to print your step with your output that you want use this loop 
     l = [listOfsteps[:i+1] for i in range(len(listOfsteps))] 
     print "ListOfSteps", l 

     return self.method(r, j) 

Main() 
+0

您刚刚将其他答案并入您的答案中,但没有解释为什么以及如何工作。请稍微修复你的答案,现在它的质量很低。 –

+0

我是新的在stackoverflow这是我的拳头答案,非常感谢您的建议:) –