Python return.

Joseph -  
Jithel Messages postés 843 Date d'inscription   Statut Membre Dernière intervention   -
Salut,
Voila j'ai une petite question, j'ai une fonction qui prend en entrée un a,b et une grille qui est une liste, bref
au début ces valeurs sont 2,6.
Ensuite dans la fonction, je vérifie à la fin que ces valeurs on bien changé : print(a,b) ---> 1,6
donc jusque la tout est bon.
Je retourne donc a,b
return(a,b,grille)
puis je reprint a,b pour vérifier.
print(a,b) ----> 2,6
le problème c'est que ça me retourne les anciennes valeur je ne comprend pas pourquoi.
Si vous avez une idée merci de m'aider.
ma fonction est dans un autre fichier python, mais je l'utilise avec le from … import *



Configuration: Windows / Edge 17.17134
A voir également:

2 réponses

Jithel Messages postés 843 Date d'inscription   Statut Membre Dernière intervention   171
 
Tu peux publier un peu plus de code ? Je comprends le problème mais je ne sais pas vraiment comment tu arrives à ce résultat. Fais un copier / coller de ton code dans les balises Python du forum (bouton <> du menu d'édition puis Python).
0
Joseph
 
def mouvement(a,b,grille):    #ici a=2 et b= 6
    bouger=False
    while bouger!= True: 
        print("vous allez choisir vers ou déplacer votre pion")
        if b>0 and a>1 and b<8 and a<10: 
       

ici il y a plein de condition mais du coup qui fonctionne
   
   print(a,b)                              #   a=1 b=2
   return(a,b,grille)



from affi import *
from mouve import *


grille=['[[ 0 ]  [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ 6 ]  [ 7 ]  [ 8 ]  [ 9 ]]',[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],[['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],],[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],[['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],],[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],[['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],['○'],],[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],[['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],['◙'],],[[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' '],[' ']],]


bouger=False
joueur=1
Tour=0

while Tour!=20:

    
    AffichageGrille(grille)

    pions=False
    while pions!=True:
        a=int(input("Veuillez selectionner l'ordonné du pion  :"))
        b=int(input("Veuillez selectionner l'abscisse du pion :"))
        print (grille[a][b])
        pions=SelectionDuPion(joueur,grille,a,b)
    print("Le pion que vous avez selectionner et le pion en :","(",a,",",b,")")    
    mouvement(a,b,grille)
    print("vous avez déplacer votre pion en",a,b)                        #le résultat afficher est 2,6
        
    
    if joueur==1:
        joueur=2
    elif joueur==2:
        joueur=1
    Tour+=1


je n'ai pas mis dans le code la fonction afficher qui sert juste a print le grille ni sélection du pion car elle fonctionne assez bien. Si cela peut vous aidez dans la compréhension.
0
Jithel Messages postés 843 Date d'inscription   Statut Membre Dernière intervention   171
 
Alors c'est pas facile à comprendre mais pour la solution la plus simple à implémenter je dirais :
def mouvement(): # en réalité, tu n'as pas besoin de ces paramètres
   # Ajouter la ligne suivante au début de la fonction
   global a, b, grille
   # …
   # Tu peux enlever le return


Pour l'explication : quand tu définis une variable a, b et grille dans ton code et que tu passes en paramètre d'une fonction ces valeurs, ce qu'il se passe c'est que Python duplique ces variables pour les exploiter localement à ta fonction puis les supprime. Bien que les paramètres de ta fonction et le nom de tes variables soient identiques, tu pourrais très bien définir ta fonction mouvement comme suit :
def mouvement(param1, param2, param3):
   # …

ça aurait le même effet (en veillant à remplacer a,b et grille par param1, param2 et param3 dans ta fonction mouvement).

La ligne global permet de dire à Python : les variables que j'utilise dans ma fonction nommées a, b et grille sont celles définies en dehors de la fonction. De ce fait, effectue les modifications sur celles-ci directement.

Une autre solution serait de faire :

def mouvement(a, b, grille):
   # Ton code
   return (a, b, grille)
# a, b et grille sont définis en dehors de ta fonction
resultat = mouvement(a, b, grille)
a = resultat[0]
b = resultat[1]
grille = resultat[2]
# Le reste de ton code
0
Joseph > Jithel Messages postés 843 Date d'inscription   Statut Membre Dernière intervention  
 
merci beaucoup ! la première technique n'a pas marché le b n'est pas rentré en compte mais j'ai utilisé la seconde et ça me convient à la perfection ;) merci de votre rapidité et de votre compréhension !
0
quent217 Messages postés 420 Date d'inscription   Statut Membre Dernière intervention   347
 
Bonjour,
il est aussi possible de faire :
a, b, grille = mouvement(a, b, grille)

Ca fait exactement la même chose mais c'est plus court et ça utilise une varaible de moins ;)
Bonne soirée.
0
Jithel Messages postés 843 Date d'inscription   Statut Membre Dernière intervention   171 > quent217 Messages postés 420 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour l'astuce. Je connaissais pas.
0