Rekursives Verarbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

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
Zuletzt geändert von maxi_king_333 am Samstag 9. April 2011, 13:51, insgesamt 1-mal geändert.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

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

Viele Grüße
Maxi
Antworten