2010-01-26 6 views
1

J'ai un problème avec python ici. Si je passe un tableau grâce à une fonction récursive qui ajoute quelque chose au tableau à chaque fois qu'il est appelé, le tableau est modifié dans chaque casPython: empêcher que le tableau d'arguments soit globalement modifié

code:

def test(n,myList): 
    if n>0: 
     myList.append("Test") 
     print ("BEFORE CALL Instance ", n, myList) 
     test(n-1,myList) 
     print ("AFTER CALL Instance ", n, myList) 
    else: 
     return 

Exécution via test(5,[])

Résultats:

BEFORE CALL Instance 5 ['Test'] 
BEFORE CALL Instance 4 ['Test', 'Test'] 
BEFORE CALL Instance 3 ['Test', 'Test', 'Test'] 
BEFORE CALL Instance 2 ['Test', 'Test', 'Test', 'Test'] 
BEFORE CALL Instance 1 ['Test', 'Test', 'Test', 'Test', 'Test'] 
AFTER CALL Instance 1 ['Test', 'Test', 'Test', 'Test', 'Test'] 
AFTER CALL Instance 2 ['Test', 'Test', 'Test', 'Test', 'Test'] 
AFTER CALL Instance 3 ['Test', 'Test', 'Test', 'Test', 'Test'] 
AFTER CALL Instance 4 ['Test', 'Test', 'Test', 'Test', 'Test'] 
AFTER CALL Instance 5 ['Test', 'Test', 'Test', 'Test', 'Test'] 

Problème réel:

Chaque fonction enfant modifie le tableau dans toutes les fonctions parentes. Comment puis-je empêcher cela?

Copie la liste dans un nouveau et en le modifiant entraîne le même résultat que ci-dessus

myListNew=myList 
myListNew.append("Test") 

Répondre

5

Votre tentative de solution ne copie pas en fait le tableau. Il attribue un nouveau nom au même tableau. Si vous voulez créer un nouveau tableau, essayez ceci:

my_new_list = my_list[:] 

Cela crée une liste contenant une tranche de l'ancienne liste, où la tranche commence au début, et se termine à la fin. En d'autres termes, une copie parfaite de la liste.

+0

+1 - Exactement, il suffit de passer 'test (n-1, myList [:])' – sberry

+0

Y at-il une solution de contournement pour ce faire sur les tableaux (dictionnaires) aussi? il dit "type non lavable". – lamas

+1

Extraire le module de copie dans la bibliothèque: 'another_d = copy.copy (d)'. Ou essayez 'another_d = dict (d)'. – jcdyer

1

Vous pouvez utiliser copy.deepcopy() pour renvoyer une liste non liée. Cela fonctionne également pour les listes imbriquées et les dicts.

Questions connexes