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 :

Déclaration de variables


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut Déclaration de variables
    Bonjour,

    J'avais cru comprendre qu'une variable déclarée hors-fonction était reconnu dans les fonctions, si je retire global a, j'ai un message d'erreur m'indiquant que la variable n'est pas assignée, pourtant je l'assigne avant l'appel à la fonction :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def toto():
        global a  #   Obligation de la déclarer en globale, c'est normal ?
        print(a)
        a=1
        print(a)
     
    a=2   # Assignation de la variable
    toto()
    Donne :
    2
    1


    Pourquoi dois-je la déclarer en global dans la fonction, c'est normal ?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Oui c'est normal car ta fonction contient une assignation: a=1. De ce fait, et en l'absence de déclaration avec le mot-clé global, Python considère alors a comme une variable locale (dans toute la fonction), ce qui provoque une erreur au premier print(a), car à cet instant la variable locale a n'est pas encore définie.
    Par contre si tu enlèves, de la fonction, cette assignation, Python considérera, puisqu'aucune variable de même nom n'est définie localement, que tu fais référence à la variable a du main, celle-ci étant globale.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Merci,

    Donc la variable est globale, puis il y a l'appel à la fonction et elle devient locale (dans sa fonction seulement) si je comprend bien.
    Mince, je dois donc mettre "global a" au début de chaque fonction qui en a besoin.

    Il y a une autre solution plus propre ?

  4. #4
    Membre chevronné
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Par défaut
    Bonjour

    Vous pouvez faire une classe contenant la variable "a" et contenant une méthode pour l'afficher ou la modifier

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Je voulais éviter les classes pour cela. Tant pis.
    Merci pour votre temps à tous deux.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Donc la variable est globale, puis il y a l'appel à la fonction et elle devient locale (dans sa fonction seulement) si je comprend bien.
    Oui mais seulement du fait de la présence d'une assignation de la variable dans la fonction. Car si tu écris simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def toto():
        print(a)
     
    a=2
    toto()
    Tu obtiendras bien 2.

    Mince, je dois donc mettre "global a" au début de chaque fonction qui en a besoin.

    Il y a une autre solution plus propre ?
    Le fait de rajouter une ligne à une ou plusieurs fonctions n'a jamais rendu un script "plus sale". Méfie toi des expressions fourre-tout.
    Après moi je ne sais pas ce que tu veux faire et quels sont tes besoins. Donc entre rajouter global, passer la variable en paramètre et la renvoyer ou créer une classe dont a serait une propriété, je ne peux pas trop me prononcer. À toi de voir.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Bonjour

    Vous pouvez également utiliser une variable local temporaire.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def toto():
        b = a
        print(b)
        b = 1
        print(b)
    a=2   # Assignation de la variable 
    toto()

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 705
    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 705
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Donc la variable est globale, puis il y a l'appel à la fonction et elle devient locale (dans sa fonction seulement) si je comprend bien.
    Mince, je dois donc mettre "global a" au début de chaque fonction qui en a besoin.

    Il y a une autre solution plus propre ?
    Une fonction "pure":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> def f(a):
    ...     print (a)
    ...     a = 1
    ...     return a
    ...
    >>> a = 2
    >>> a = f(a)
    2
    >>> print (a)
    1
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Merci Wiztricks,

    C'est mieux et plus simple.

  10. #10
    Membre confirmé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2018
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2018
    Messages : 73
    Par défaut
    Bonjour,

    en fait, pour bien comprendre, Python interdit par défaut la modification de variables "globales" car cette pratique relève plus de la magie que de l'algorithmie. Dans la pratique, maintenir un tel code est juste horrible. La notion de "fonction pure" proposée par wiztricks est en effet considéré comme une bonne pratique et elle consiste à modifier explicitement la variable au niveau auquel elle se trouve. Donc par affectation du retour de la fonction. Cette pratique est la base de la programmation fonctionnelle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. déclaration de variable public
    Par mathieu57 dans le forum MFC
    Réponses: 5
    Dernier message: 15/09/2005, 17h36
  2. [DB2] Ordre de déclaration des variables
    Par Fatah93 dans le forum DB2
    Réponses: 1
    Dernier message: 04/05/2005, 17h18
  3. déclaration de variables de 16, 32 et 128 bits
    Par samipate dans le forum C++
    Réponses: 10
    Dernier message: 30/12/2004, 22h33
  4. [FLASH MX2004] Déclaration de variables sous flash mx
    Par softyClochette dans le forum Flash
    Réponses: 4
    Dernier message: 29/11/2004, 16h11
  5. [debutant][Portée] Déclaration de variable .....
    Par Slein dans le forum Langage
    Réponses: 4
    Dernier message: 07/05/2004, 10h43

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