2011-05-09 4 views
0

Possible en double:
“Least Astonishment” in Python: The Mutable Default ArgumentBug ou malentendu dans Python 2.7?

Suis-je manque quelque chose ou est-ce vraiment un bug? Voici une fonction récursive qui génère une liste multidimensionnelle à partir d'une spécification de tuple, par exemple.

dim((2,3)) 
returns 
[[[],[],[]],[[],[],[]]] 

Le seul problème est qu'il ajoute à la liste chaque fois que je l'appelle, si je l'appelle sans le paramètre par défaut, si je spécifie le paramètre par défaut comme faible ((2,3), []) , alors ça va. C'est en sauvegardant l'état du paramètre par défaut à chaque appel! Si personne ne peut trouver un problème avec ce que je fais, je vais l'entrer dans le rapporteur de bug python.

cdr = lambda l : l[1:] 
car = lambda l : l[0] 
last = lambda x : x[-1:][0] 


def dim(t, c = []): 
    if len(t) > 0: 
     i = car(t) 
     for j in range(i): 
      c.append([]) 
      dim(cdr(t), last(c)) 
    return c 


print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 

Répondre

0

def dim(t, c = [])

Il est un bug (dans votre code). Cette partie c = [] n'est évaluée qu'une seule fois pendant tout le programme. Lorsque vous appelez dim, c est continuellement ajouté. Une meilleure approche serait la suivante:

def dim(t, c=None): 
    if c is None: 
     c = [] 
    ... 
+0

Exactement. Mais à nitpick, 'is' est préféré pour les comparaisons avec les singletons (le plus notable, bien sûr,' None') - c'est-à-dire 's/if c == None/si c est None /'. – delnan