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 :

Probleme : Variables globales pas accessible


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut Probleme : Variables globales pas accessible
    C'est un classique de python , après avoir browsé le web , je suis dans l'impasse :
    Voila le code entier de mon module :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    import os, sys, random , math
    import psyco
     
    import main
     
    psyco.full()
     
     
     
    import socket, sys, threading 
     
    class ThreadServeur(threading.Thread): 
       def __init__(self): 
        threading.Thread.__init__(self) 
     
       def run(self):
         main.init
     
    class ThreadClient(threading.Thread): 
     
     def __init__(self, conn): 
      threading.Thread.__init__(self) 
      self.connexion = conn 
     
     def run(self): 
     
      nom = self.getName() 
      while 1: 
        msgClient = self.connexion.recv(1024) 
        if msgClient.upper() == "FIN" or msgClient =="": 
          break 
        message = "%s> %s" % (nom, msgClient) 
        print message 
     
        for cle in start.conn_client: 
          if cle != nom:
            global conn_client
            conn_client[cle].send(message) 
     
     
     
      self.connexion.close() 
      del conn_client[nom] 
      print "Client %s deconnecte." % nom 
     
    def start(HOST,PORT):
     
      main = ThreadServeur()
      main.start()
     
      mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
      try: 
        mySocket.bind((HOST, PORT)) 
      except socket.error: 
        print "La liaison du socket a l'adresse choisie a echoue." 
        sys.exit() 
      print "Serveur pret, en attente de requetes ..." 
      mySocket.listen(5) 
     
     
      global conn_client
      conn_client = {} 
      while 1: 
        connexion, adresse = mySocket.accept() 
     
        th = ThreadClient(connexion) 
        th.start() 
     
        it = th.getName() 
        conn_client[it] = connexion 
        print "Client %s connecte, adresse IP %s, port %s." % (it , adresse[0], adresse[1])
     
     
        connexion.send("Vous etes connecte")
    C'est " conn_client[cle].send(message) " qui ne marche pas , il ne le trouve pas definis. pourtant :
    global conn_client
    conn_client = {}
    et je l'appele comme ceci :
    global conn_client
    conn_client[cle].send(message)

    Est-ce que quelqu'un peut m'eclairer ? j'ais lu un topic dans ce forum sur ce même sujet mais sans résultat.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 259
    Points : 195
    Points
    195
    Par défaut
    Salut!
    Je trouve bizarre que tu déclares ta variable uniquement dans ta fonction.
    La manière dont je le fais moi, c'est déclarer tout au début, pas dans une fonction, pas dans une classe, mais juste après les import, après seulement, dans la fonction ou dans la classe, j'appelle la variable et je l'utilise.
    La vie n'est qu'une succession d'éternels recommencements

  3. #3
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Voici comment faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    x = 10
     
    def fonction():
        global x
        return x + x
    Le statement global dit que la variable qui suit doit utiliser la valeur de la variable global du même nom pour la durée du scope dans lequel on se trouve.

    Pour plus d'informations: http://docs.python.org/ref/global.html

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Bibicmoi
    Salut!
    Je trouve bizarre que tu déclares ta variable uniquement dans ta fonction.
    La manière dont je le fais moi, c'est déclarer tout au début, pas dans une fonction, pas dans une classe, mais juste après les import, après seulement, dans la fonction ou dans la classe, j'appelle la variable et je l'utilise.
    Oui , je de declare ma variable de partout (et nulle par , j'ais tout essayé) , mais ça ne fait rien , c'est d'ailleur pour ça que j'ais fais ce topic.

    Et sinon :
    Citation Envoyé par GnuVince
    x = 10

    def fonction():
    global x
    return x + x
    Je vais voir... La somme des deux x est bien sur optionnelle dans l'exemple , ein , l'important c'est le return?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 259
    Points : 195
    Points
    195
    Par défaut
    Citation Envoyé par ickylevel
    Je vais voir... La somme des deux x est bien sur optionnelle dans l'exemple , ein , l'important c'est le return?
    Non, ce qu'il y a d'important, c'est l'initialisation de ta variable avant le début de la fonction, et la déclaration global au début.
    C'est ce que j'expliquais dans mon précédent message, en beaucoup moins bien que GnuVince
    La vie n'est qu'une succession d'éternels recommencements

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    En tout cas c'est bizarre , j'ais vu sur un blog que l'on pouvait faire un print de la variable , tout en obtenant l'erreur que j'obtient en tentant autre chose...

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Euh, je trouve que l'exemple donné par GnuVince n'est pas vraiment approprié, puisque si l'on retire l'instruction global de sa fonction, elle se comporte exactement de la même façon.

    Une fonction aura toujours accès en lecture aux variables déclarées dans le niveau principal, pour l'accès en écriture, on doit utiliser global.
    Si on tente d'écrire dans une variable déclarée dans le niveau principal sans utiliser global dans la fonction, alors une nouvelle variable sera créée, et celle-ci sera automatiquement détruite quand la fonction prendre fin (car il n'y aura plus de références sur celle-ci).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> def fonc1():
    ...     foobar = 42
    ... 
    >>> def fonc2():
    ...     global foobar
    ...     foobar = 42
    ... 
    >>> foobar = 0
    >>> fonc1()
    >>> print foobar
    0
    >>> fonc2()
    >>> print foobar
    42
    <3 Debian
    [ C | C++ | PHP | Python ]

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Ok il faut utiliser global et donner une valeur à la variable "dès le début".
    Merci à tous.

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

Discussions similaires

  1. Variable globale, pas globale.
    Par nuphius dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/02/2009, 18h07
  2. Probleme variables global
    Par stuffy dans le forum Général Python
    Réponses: 7
    Dernier message: 17/06/2008, 10h11
  3. variables globales vba access
    Par binouzzz19 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/09/2007, 09h05
  4. probleme variable global
    Par acik59 dans le forum C
    Réponses: 9
    Dernier message: 14/05/2007, 16h34
  5. Réponses: 22
    Dernier message: 23/11/2006, 23h42

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