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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    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 Expert
    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
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    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 Expert
    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 : 61
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 82
    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

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