2010-04-01 4 views
1

J'ai une fonction qui appelle elle-même pour incrémenter et décrémenter une pile.Python: réinitialise la valeur par défaut d'une fonction pour les appels suivants à la fonction

Je dois appeler un certain nombre de fois, et je voudrais que cela fonctionne de la même façon dans les prochains appels

mais, comme prévu, il ne réutilisez pas la valeur par défaut.

J'ai lu que c'est un piège débutant et j'ai vu des solutions proposées, mais je ne l'ai pas été en mesure

pour tout travail de solution.

Il serait agréable d'être en mesure de « fun.reset »

def a(x, stack = [None]): 
    print x,' ', stack 
    if x > 5: 
     temp = stack.pop() 
    if x <=5: 
     stack.append(1) 
    if stack == []: 
     return  
    a(x + 1) 

print a(0) 
print a(2) #second call 
print a(3) #third call 

Je pensais que cela fonctionne, mais il ne fonctionne pas.

print a(0, [None]) 
print a(2, [None]) #second call 
print a(3, [None]) #third call 

Puis-je réinitialiser la fonction à son état initial?

Toute aide serait appréciée.

Répondre

4

Il suffit de passer pile explicitement lorsque vous faites appel récursif:

def a(x, stack=None): 
    if stack is None: 
     stack = [None] 
    ... 
    a(x + 1, stack) 
+0

C'est tout. C'est évident maintenant que cela m'a été signalé. Merci –

3
def a(x, stack = None): 
    if stack is None: 
     stack = [None] 
    ... 
+1

cela ne fonctionne pas. Il réinitialise simplement la pile sur [None] car les appels récursifs ne transmettent pas de valeur pour la pile. –

+0

Cependant, je comprends que vous avez souligné la faute principale dans mon raisonnement. Merci –

+0

Bien sûr, je suis content que Lukasz l'ait ramené à la maison. – Kai

0

Ce problème se produit parce que vous modifiez l'argument par défaut, qui est mutable. Comme dans la réponse de Kai, on résout généralement cela en ne modifiant pas l'argument par défaut.

Questions connexes