Seite 1 von 1

Probleme mit Variablen bei einer Funktionen

Verfasst: Donnerstag 17. Januar 2008, 11:41
von bennelli
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

Verfasst: Donnerstag 17. Januar 2008, 11:52
von BlackVivi
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.

Verfasst: Donnerstag 17. Januar 2008, 11:53
von Zap
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):
    ...

Verfasst: Donnerstag 17. Januar 2008, 11:59
von bennelli
Okay vielen Dank an euch,

damit wär mir vorerst geholfen! :D

ThX Benni