Variable non global, qui agit comme une global...

Résolu/Fermé
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 - 16 août 2014 à 23:58
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 - 18 août 2014 à 19:59
Bonsoir!

Voilà mon problème: J'ai codé un bot IRC qui parle et interagit avec les utilisateurs. Maintenant, j'ai regardé tout l'ensemble du code pour commenter peu à peu et je viens de remarquer qu'une variable agissait en tant que variable globale. Voici le code:

CHANNEL = "#Micka"

def JoinChannel():
    s.send(bytes("JOIN %s\r\n" % CHANNEL, "UTF-8"))
threading.Timer(5.0, JoinChannel).start()


Une petite explication... Après 5 secondes du lancement du programme, le bot se connecte via un socket en utilisant la commande JOIN. Maintenant, j'aimerais savoir pourquoi la variable CHANNEL dans la fonction JoinChannel() prend la valeur "#Micka", CHANNEL n'a jamais été déclaré comme global dans mon code..

Merci pour les réponses!

4 réponses

Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
Modifié par Sugel le 17/08/2014 à 10:44
c'est ptet mieux si tu passe le chan à joindre en argument de la fonction, nan ^^ ?

Python est un langage interprété, il prends donc certaines libertés vis à vis de la cohérence de ton code.

En l'occurrence, tu n'as pas de variable CHANNEL déclarée à l'intérieur de ta fonction, donc python vas de la chercher dans le main.

PS: c'est fou, moi aussi je suis sur un bot IRC en C en ce moment ^^

------------------------------------------------------------------------------------
"La peur mène à la colère. La colère mène à la haine. Et la haine ... mène à la souffrance." - Yoda
0
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 24
17 août 2014 à 17:27
Bonjour Sugel,

Ce que je ne comprends pas alors c'est que des fois, python me dit qu'il ne reconnait pas la variable, je dois donc la passer en global pour qu'elle puisse être utilisé dans le main et la fonction...
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
17 août 2014 à 17:53
effectivement, oui.

de toute façon il est fortement déconseillé d'utiliser des variables globales, au point que tu n'aurai même pas du avoir l'occasion de poser la question :p
0
Utilisateur anonyme
17 août 2014 à 21:35
@MickaToast,

CHANNEL est bien une variable globale et locale dans le sens où tu déclares cette variable dans la partie principale du programme qui a deux dictionnaires, un global et un local.

Tu pourras l'utiliser dans le programme principal et dans tes fonctions du programme.

Par contre tu pourras modifier cette variable que dans la partie principale du programme, non dans une fonction. Dans le cas où tu souhaites le faire il faudra utiliser un mot clé qui est global. Effectivement, comme Sugel le suggère (il pensait certainement à ce mot clé), le mot clé global n'est pas conseillé, c'est très moche dans le sens où les débutant qui l'utilisent font du bricolage avec.

Exemple avec l'écriture d'une variable globale

CHANNEL = None

def modify():
    CHANNEL = "hello"
    
modify()

print(CHANNEL) # None, CHANNEL est pas modifié 


Maintenant avec le mot clé global

CHANNEL = None

def modify():
    global CHANNEL
    CHANNEL = "hello"
    
modify()

print(CHANNEL) # Affichage de hello, CHANNEL est modifié
0
MickaToast Messages postés 142 Date d'inscription mercredi 19 février 2014 Statut Membre Dernière intervention 23 juillet 2015 24
18 août 2014 à 19:59
Ah je comprend mieux à quoi sert global du coup (oui, le débutant qui fait du bricolage c'était bien moi :D), mais du coup merci de m'avoir éclairé sur le fonctionnement du mot clé global!

Merci à vous deux et bonne soirée.
0