Probleme mit Variablen bei einer Funktionen

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
bennelli
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2008, 11:29

Donnerstag 17. Januar 2008, 11:41

Hallo,
dieser Code sollte eine Permutation durchführen, das tut er auch.
Aber bei mehrmaligen ausführen werden die aktuellen Ergebnisse immer an die vorherigen Ergebnisse angehängt.

Woran könnte das liegen ?

Code: Alles auswählen

def perm(source, dest=[], done=0, current=[]):
   if done == len(source):
      if current[0] < current[-1]:
         dest.append(current)
   else:
      for i in source:
         if i not in current:
            perm(source, dest, done+1, current+[i])
      return dest
Also einmal ausführen:

d=['a','b','c']
perm(d)
[['a', 'b', 'c'], ['a', 'c', 'b'], ['b', 'a', 'c']]


Beim zweiten mal:

perm(d)
[['a', 'b', 'c'], ['a', 'c', 'b'], ['b', 'a', 'c'], ['a', 'b', 'c'], ['a', 'c', 'b'], ['b', 'a', 'c']]



Vielleicht kann mir ja jemand weiter helfen ?

Gruß,
Benni
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 17. Januar 2008, 11:52

Vorgabewert + Listen = Gelber Schnee
Mutable Objekte werden beim def aufgerufen und nicht bei jedem Funktionsaufruf.

Benutz lieber None und prüf darauf... Was anderes würde mir spontan nicht einfallen.

//Edit: Beziehungs alle Vorgabewerte werden beim Def aufgerufen, nit nur Mutable Objekte. Aber da fällt's halt auf.
Zuletzt geändert von BlackVivi am Donnerstag 17. Januar 2008, 11:59, insgesamt 1-mal geändert.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Donnerstag 17. Januar 2008, 11:53

Das hängt damit zusammen das die Initialisierung von Defaultweten nur beim ersten mal durchgeführt wird. D.h. das kein neues Objekt beim Funktionsaufruf erzeugt wird sondern immer wieder die selbe Refernz benutzt wird.
Um das zu umgehen müsstest du explizit eine leere Liste übergeben oder deinen Defaultwert als None festlegen.

Code: Alles auswählen

def perm(source, dest=None, done=0, current=None):
    if dest is None:
        dest = []
    if current is None:
        current = []
    if done == len(source):
    ...
bennelli
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2008, 11:29

Donnerstag 17. Januar 2008, 11:59

Okay vielen Dank an euch,

damit wär mir vorerst geholfen! :D

ThX Benni
Antworten