Seite 1 von 1

Rekursives Verarbeiten

Verfasst: Samstag 9. April 2011, 11:42
von maxi_king_333
Hallo Liebe Foren-Gemeinde,

ich habe ein Problem beim rekursiven Verarbeiten von Daten, das sich damit reproduzieren lässt.

Code: Alles auswählen

def test(dictionary, search, elemente = []):
    print(elemente)
    for key in dictionary:
        if key == search[0]:
            if len(search) > 1:
                elemente = test(dictionary[key], search[1:], elemente)
            else:
                elemente.append(dictionary[key])
    return elemente
    
test_dict = {'test_1' :
                {'test_1_1' : 
                    {'test_1_1_1' : 'test_1_1_1',
                        'test_1_1_2' : 'test_1_1_2',
                        'test_1_1_3' : 'test_1_1_3'}},
                'test_2' : 'test_2'}

print('test_1')
test_1 = test(test_dict, ['test_1', 'test_1_1'])[0]
print(test_1)
print('test_2')
test_2 = test(test_1, ['test_1_1_1'])
print(test_2)
Die Ausgabe sieht so aus,

Code: Alles auswählen

test_1
[]
[]
{'test_1_1_3': 'test_1_1_3', 'test_1_1_2': 'test_1_1_2', 'test_1_1_1': 'test_1_1_1'}
test_2
[{'test_1_1_3': 'test_1_1_3', 'test_1_1_2': 'test_1_1_2', 'test_1_1_1': 'test_1_1_1'}]
[{'test_1_1_3': 'test_1_1_3', 'test_1_1_2': 'test_1_1_2', 'test_1_1_1': 'test_1_1_1'}, 'test_1_1_1']
wobei ich eher soetwas

Code: Alles auswählen

test_1
[]
[]
{'test_1_1_3': 'test_1_1_3', 'test_1_1_2': 'test_1_1_2', 'test_1_1_1': 'test_1_1_1'}
test_2
[]
['test_1_1_1']
erwartet hätte.
Irgendwie behält er den letzten Wert anstatt elemente als eine leere Liste neu zu erzeugen.
Hat da jemand eine Idee?

Vielen Dank und Viele Grüße
Maxi

Re: Rekursives Verarbeiten

Verfasst: Samstag 9. April 2011, 12:17
von gkuhl
Hallo,

der Defaultwert von "elemente" wird nur einmal, nämlich bei der Definition der Funktion, gesetzt. Nicht bei jedem Funktionsaufruf, wie du es hier vermutlich erwartest. Wenn du diese Liste jetzt veränderst, veränderst du ergo den Defaultwert.

Um das zu umgehen, verwendet man meist folgenden Code:

Code: Alles auswählen

def test(dictionary, search, elemente=None):
    if elemente is None:
        elemente = []
    # dein Code...
Grüße
Gerrit

Re: Rekursives Verarbeiten

Verfasst: Samstag 9. April 2011, 13:50
von maxi_king_333
Hi,

Vielen Dank für die schnelle Antwort.
Jetzt funktioniert es.

Viele Grüße
Maxi