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 :

Variable globale et locale


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Points : 36
    Points
    36
    Par défaut Variable globale et locale
    Bonjour,
    J'ai un petit problème avec l'initialisation d'une variable globale.
    j'utilise le module wx, mais je ne pense pas qu'il entre en compte dans mon petit souci.
    Je pense que c'est un bête problème de compréhension de ma part
    Si quelqu'un peut m'expliquer pourquoi je n'arrive pas à modifier ma variable globale (PLATECARACT)
    Normalement, enfin pour moi... le normalement ^^. si je modifie la valeur d'une variable globale (list) dans une fonction, je devrais pouvoir utiliser cette nouvelle initialisation partout, non ?
    parceque là, y 'a un truc que je ne comprends pas :
    j'initialise dans le module0 la variable : PLATECARACT = [10, 20, 30]
    Ensuite, j'effectue la suite de mon programme en modifiant cette variable dans la fonction Initialize du module1.
    Puis, je rentre dans la fonction : Fonct_01 du module3. Et là, je perds le traitement de la fonction Initialize.
    Et bin pourquoi ???
    si quelqu'un peut m'apporter un peu de compréhension. Je joins mes petits modules pour plus de clarté
    Merci d'avance pour vos réponses.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Si je ne m'abuse, cela vient du fait que from module0 import * effectue en réalité une copie des variables du module0 dans le module courant.

    En Python, "variable globale" est trompeur; on devrait plutôt parler de "variable de module". En d'autres termes, chaque module a sa propre portée globale.

    Pour résoudre ton problème, tu peux remplacer from module0 import * par import module0 et les utilisations de PLATECARACT par module0.PLATECARACT. Et supprimer la déclaration global PLATECARACT, puisque la qualification indique qu'il s'agit de la variable du module0.

    Une autre possibilité serait de ne pas modifier la variable PLATECARACT elle-même, mais l'objet (la liste) vers laquelle elle pointe. C'est à dire vider la liste (del PLATECARACT[:]) et ensuite lui ajouter les nouveaux éléments (PLATECARACT.extend(self.Tempo.PLATECARACT)).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Points : 36
    Points
    36
    Par défaut
    Bonjour et merci pour ta réponse.
    Effectivement, c'était un truc comme ça
    le piège, c'est de nommer ces variables "Globale". Et de ne pas appréhander la notion de portée réelle de ces variables.
    En tout cas, tu me donnes la possibilité d'utiliser deux manières différentes de résoudre mon souci.
    merci.

  4. #4
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Pour répondre à ton besoin, j'aurais tendance à préférer l'utilisation du pattern 'Singleton'.

    Le principe d'un singleton est de déclarer une classe qui renvoie toujours la même et unique instance.

    Cette approche permets d'éviter la notion de global.

    De plus, par le fait d'utiliser une classe, tu gagnes la possibilité d'implémenter des getter/setter et ainsi de rendre indépendante l'implémentation de ta "variable"

    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
    23
    24
    #!/usr/bin/python
    # -*- coding: cp1252 -*-
     
    class Singleton(object):
        class __Singleton:
            def __init__(self):
                self.val = None
            def __str__(self):
                return `self` + self.val
     
        instance = None
     
        def __new__(c):
            if not Singleton.instance:
                Singleton.instance = Singleton.__Singleton()
            return Singleton.instance
     
        def __getattr__(self, attr):
            return getattr(self.instance, attr)
     
        def __setattr__(self, attr, val):
            return setattr(self.instance, attr, val)
     
    Singleton().PLATECARACT = [10, 20, 30]
    Avec cette déclaration, a chaque fois que tu dois utiliser ta variable globale, tu utilises à la place : Singleton().<ta variable>

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    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 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,
    Citation Envoyé par DelphiManiac Voir le message
    Pour répondre à ton besoin, j'aurais tendance à préférer l'utilisation du pattern 'Singleton'.
    En Python, ce pattern (de conception) peut être simplement réalisé avec ce qu'on appelle "module". Ca correspond à l'utilisation d'import module0 telle que proposée par Dividee - import étant généralement préféré à from XXX import * pour entre autre cette raison.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Singleton().PLATECARACT = [10, 20, 30]
    # équivalent à
    module0.PLATECARACT = [10, 20, 30]
    - W

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    Points : 36
    Points
    36
    Par défaut
    Bonjour,
    Merci de vos réponses.
    J'avoue n'avoir pas compris grand chose dans ton bout de code DelphiManiac
    Mais par contre, si j'ai bien compris ce que dit Wistricks, que j'utilise Module0.PLATECARACT ou singleton().PLATECARACT, cela revient au même !?!
    J'ai peut être intérêt à utiliser la méthode de W. et de dividee, non ?
    En tout cas, j'arrive à la comprendre celle ci

  7. #7
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par Yachas Voir le message
    Mais par contre, si j'ai bien compris ce que dit Wistricks, que j'utilise Module0.PLATECARACT ou singleton().PLATECARACT, cela revient au même !?!
    Oui, le fait que ton objet soit dans un module (Module0) ou une classe (Singleton) importe peut.
    Pour simplifier au maximum l'idée de DelphiManiac:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Singleton(object):
        PLATECARACT = [10, 20, 30]
     
    class test(object):
         print Singleton().PLATECARACT
     
    test()
    Je trouve cela bien utile en fait.

    Bon code.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    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 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Salut,
    Quel est l'intérêt d'instancier - i.e. mettre () - dans ce cas particulier?

    L'écriture:
    class Singleton(object):
    PLATECARACT = [10, 20, 30]

    class test(object):
    print Singleton.PLATECARACT

    test()
    sera semblable que la boîte de type 'classe' ou 'module'.

    Ne pas 'instancier' permettra de ne pas avoir de soucis côtés mises à jour qui se feront par défaut sur l'attribut PLATECARACT de l'instance et non celui de la classe - autrement dit, chaque instance aura une copie différente de l'attribut et ce n'est pas la propriété qu'on attend d'un "Singleton"

    C'est pour pallier cela qu'on devra dans ce cas définir __new__ retournant l'instance "unique" ou passer par un Borg pour retourner des instances différentes avec un __dict__ partagé.
    Dans des langages ou tout est "classes" tel que Java, nous n'avons pas le choix. Les variables Python étant des "références" n'importe quelle boîte peut être utilisée pour définir des variables globales. Il suffit de ne pas oublier de les accéder via l'adresse de la boîte(*).
    (*) Sauf à les mettre dans __builtin__ si on veut hacker un peu.
    - W

  9. #9
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par wiztricks Voir le message
    Quel est l'intérêt d'instancier - i.e. mettre () - dans ce cas particulier?
    Aucune, c'est juste une réponse trop rapide (pour changer... )
    Et dire que j'utilise cela dans mes codes...

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 311
    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 311
    Points : 36 813
    Points
    36 813
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Aucune, c'est juste une réponse trop rapide (pour changer... )
    Et dire que j'utilise cela dans mes codes...
    Cela ne les empêchera pas de fonctionner.
    Reste que coder sans s'exposer à des revues de code n'est pas le plus aisé pour progresser.
    - W

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Cela ne les empêchera pas de fonctionner.
    Reste que coder sans s'exposer à des revues de code n'est pas le plus aisé pour progresser.
    - W
    Sans aucun doute.
    Comme je code en Python pour le plaisir et non au niveau professionnel j'ai sans doute tendance a oublier que nous sommes sur un forum pro et que je risque de me faire wiztricksemer.
    Pour le reste pas de panique: Mon code est pour une utilisation perso et ma présence sur le Forum pour le plaisir de lire vos réponses.

    Ceci dit ma réponse reste exacte: Qu'importe la 'boîte' si la porté est bonne.

    Bonne journée

Discussions similaires

  1. Variable globale et locale
    Par Super_carotte dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 17/05/2010, 13h58
  2. variables globales et locales
    Par une_tite_question dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 25/06/2008, 18h32
  3. Variable globale et locale
    Par momo70 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/07/2007, 09h49
  4. variables globales ou locales
    Par exhortae dans le forum C
    Réponses: 6
    Dernier message: 09/04/2007, 01h29
  5. variable globale ou locale pour CurrentDB
    Par jibouze dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2006, 17h15

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