IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Récupérer une variable définie dans le corps d'une fonction appelée antérieurement


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Pays-Bas

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 17
    Par défaut Récupérer une variable définie dans le corps d'une fonction appelée antérieurement
    Bonjour,

    Je ne suis plus tout à fait débutant en Python, même si je suis loin d'être un développeur chevronné.
    Je voudrais vous poser une question liée à la portée de variables et à des appels imbriqués de fonctions.

    J'ai besoin qu'une fonction (fonction1) appelle une fonction (fonction2) qui modifie une variable définie dans le corps de fonction1.
    J'ai ajouté un bout de code pour mieux vous faire comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    def fonction1():
        """
        la fonction "de base"
        """
        liste = []
        fonction2()
     
    def fonction2():
        """
        une sous-fonction qu'on a besoin d'appeler dans la fonction de base.
        """
        liste.append("une chaine")
     
    print("C'est parti pour un essai.")
     
    fonction1()
    À l'appel de fonction1, Python recrache l'erreur suivante:
    "NameError: name 'liste' is not defined".

    Cela me paraît un peu étrange. Je croyais que dans un encfhaînements d'appels de fonctions, Python remonte pas à pas vers la première fonction, et regarde dans chaque corps de fonction s'il y trouve la variable cherchée.
    Bref, je ne comprends pas ce comprotement, et j'espère trouver un moyen de faire marcher cette construction tout de même.

    Merci beaucoup d'avoir lû ma question!

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Par défaut
    Bonjour,

    En Python une fonction ne peut modifier la valeur d'une variable extérieure à son espace locale.
    Tu peux regarder ce lien : https://python.developpez.com/tutori...?page=fonction.
    La partie : IV-A-1-d-i. Portée de variable, est consacrée à cela.

    Dans ton cas tu peux passer ta liste en paramètre de la fonction2 et ton code devient (avec un ajout pour afficher le contenu de ta liste):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def fonction1():
        """
        la fonction "de base"
        """
        liste = []
        fonction2(liste)
        print(liste)
     
    def fonction2(une_liste):
        """
        une sous-fonction qu'on a besoin d'appeler dans la fonction de base.
        """
        une_liste.append("une chaine")
     
    print("C'est parti pour un essai.")
     
    fonction1()
    Je ne suis pas une pro en Python, ce n'est peut-être pas la meilleure réponse, mais au moins ça fonctionne .

    Bonne journée

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Si si, c'est la bonne réponse : il faut se servir des paramètres pour communiquer des variables entre fonctions. Notez qu'ici on n'a pas besoin de return car la liste est une variable mutable. Si ca avait été un entier on aurait du faire comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    def fonction1():
        """
        la fonction "de base"
        """
        un_entier = 2
        un_entier=fonction2(un_entier)
        print(un_entier)
     
    def fonction2(un_entier):
        """
        une sous-fonction qu'on a besoin d'appeler dans la fonction de base.
        """
        nouvel_entier = un_entier*10
        return nouvel_entier
     
    print("C'est parti pour un essai.")
     
    fonction1()
     
    print("C'est parti pour un essai.")
     
    fonction1()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,


    Citation Envoyé par Bram van Dam Voir le message
    Je voudrais vous poser une question liée à la portée de variables et à des appels imbriqués de fonctions.
    Des appels imbriqués de fonctions çà s'écrit comme çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >> def f():
    ...      def g():
    ...            print (a)
    ...      a = 2
    ...      g()
    ...
    >>> f()
    2
    et effectivement, pour trouver a lors de l'exécution de g Python va d'abord regarder ce qui a été défini par la fonction englobante et s'il ne trouve pas ira chercher côté variables globales.

    Citation Envoyé par Bram van Dam Voir le message
    J'ai besoin qu'une fonction (fonction1) appelle une fonction (fonction2) qui modifie une variable définie dans le corps de fonction1.
    Par défaut, les variables créées par une fonction ne sont accessibles (la portée) que par cette fonction.
    Donc pour appeler une autre fonction qui... il faut lui passer la variable en paramètre et que la fonction retourne la nouvelle valeur à assigner à la variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def g(a):
    ...       return a+1
    ...
    >>> def f():
    ...      a = 0
    ...      print(a)
    ...      a = g(a)
    ...      print (a)
    ...
    >>> f()
    0
    1
    La ou les choses se compliquent un peu avec Python (et les langages qui permettent de passer en argument par référence) est la différence entre objets dit non mutables (entiers, flottants, chaines de caractères) et les objets mutables (listes, dictionnaires,...).
    Avec une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> def g(L):
    ...       L.append('aaa')
    ...
    >>> def f():
    ...      L = []
    ...      print (L)
    ...      g(L)
    ...      print (L)
    ...
    >>> f()
    []
    ['aaa']
    Et pourtant la fonction g ne retourne rien.

    Citation Envoyé par Bram van Dam Voir le message
    Je ne suis plus tout à fait débutant en Python, même si je suis loin d'être un développeur chevronné.
    Débutant ou pas, lorsque vous avez des questions de bases, il est quand même plus instructifs de relire les chapitres correspondants de votre tuto. préféré. Ça vous permet d'apprendre/revoir des choses qui vont "autour" de tout çà, de vous approprier le vocabulaire technique qui va avec et éventuellement de découvrir d'autres pistes pour résoudre votre problème.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/06/2011, 11h30
  2. Appeler dans une requête des variables définies dans une macro
    Par piflechien73 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/08/2009, 15h12
  3. Réponses: 7
    Dernier message: 23/06/2009, 09h33
  4. Réponses: 1
    Dernier message: 27/05/2009, 09h19
  5. [XSLT] Réutiliser une variable définie dans une boucle
    Par DelphLaga dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/10/2006, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo