2016-08-08 8 views
-1

Ich verwende eine rekursive Funktion auf einer Liste von Listen mit einem Akkumulator, aber anstatt die richtige Liste von Listen zu erstellen, erstellt es eine Liste mit Duplikaten des letzten Eintrags in den Akkumulator eingefügt . Ich habe das Problem in einer viel einfacheren rekursiven Funktion und Liste neu erstellt. Diese Funktion nimmt eine Liste von Listen und erstellt 2 Kopien und kehrt sie n-mal um.Rekursive Funktion in Python ändert sich nicht Liste

def recursauto(x, n, instSet): 
    #Base Case 
    if(n==0): 
     instSet.append(x) 
     print(x) #Print to see what SHOULD be added 
    else: 
     temp = [x]*(2) # Make a list with 2 copies of the original list 
     for i in range(len(temp)): 
      temp[i][i] = temp[i][i][::-1] # Make the list backwards 
     for i in range(2): 
      recursauto(temp[i], n-1, instSet) #Input each element 

MyList = [] #Empyt list for accumulator 
print("Correct output:") 
recursauto([["A", "l", "e", "x"], ["A", "b", "d", "a", "l", "a", "h"]], 2, MyList) 

print("Wrong printed list:") 
for i in MyList: 
    print(i) #Print what is in the accumulator 

Die Ausgabe kommt falsch und der Akku hat nicht die richtigen Dinge, die hineingesteckt wurden.

Ich weiß, dass es eine einfachere Möglichkeit gibt, dies zu tun, aber die Funktion, die ich tatsächlich mache, erfordert Rekursion. Wie ich schon sagte, dies ist nur eine vereinfachte Nachbildung des Problems, das ich habe.

+0

Was wäre die richtige Ausgabe? – Lando

+0

Der korrekte Ausgang ist die Liste, die in den Akkumulator geht. Dies ist das Gleiche wie das, was vor der Zeile "Falsche gedruckte Liste:" in der Ausgabe gedruckt wird. –

+0

Was ist der Zweck der rekursiven Funktion? –

Antwort

3
temp = [x]*(2) 

Die obige Zeile nicht eine Liste von zwei Kopien der ursprünglichen Liste erstellen; In der Tat speichert es nur zweimal einen Verweis auf die ursprüngliche Liste. Wenn Sie eine eindeutige Kopie von x möchten, versuchen Sie, den List-Kopierkonstruktor wie temp = [list(x), list(x)] oder alternativ das flache copy method[x.copy() x.copy()] zu verwenden.

Siehe das folgende Beispiel.

>>> ls = ['a'] 
>>> dup = [ls] * 2 
>>> dup 
[['a'], ['a']] 
>>> ls.append('b') 
>>> dup 
[['a', 'b'], ['a', 'b']] 
+1

Bitte verwenden Sie 'list' nicht als Variablennamen. –

+1

Allgemeinere Lösung: '[MyList für i im Bereich (a)]' wobei a die Anzahl der unabhängigen Listen ist, die benötigt werden. Verwenden Sie den Operator * nur dann, wenn Sie eine Liste mit Elementen im Hash-Format initialisieren möchten, z. B. Nummern oder Keine, nicht für Listenlisten. –

+0

Das Problem ist, dass ich das tatsächlich tue, weil ich eine Liste mit 2 * n Kopien von x benötige, also habe ich temp = [x] * (2 * n) gemacht. Was ist die Alternative dazu? –