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 :

Variables locale/globale


Sujet :

Python

  1. #1
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut Variables locale/globale
    Bonjours,

    Je rencontre des probleme avec les variable et notemment avec la 'LEGB Rule'
    (je n'ai pas trouver son equivalent en francais) alors j'aimerais que quelqu'un m'explique un peu cette loi ou sinon me donne une lien ou un document ou ceci est explique de preference en francais. Je rencontre souvent des problemes lorqu'on a une fontion qui en contient une autre

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Par défaut
    C'est simple :

    Dans une fonction, tu peux utiliser une variable globale sans la définir comme 'global' si tu fais uniquement de la lecture de cette variable.

    Si tu modifies cette variable, tu dois utiliser 'global'.

    Ce code marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    X = 1
    def Run():
     global X
     X = X + 1 # La variable X est globale .
     print 'Run X is ', X
    Ce code marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    X = 1
    def Run ():
     X = 3 # La variable X est locale .
     print "Run X is ", X
    Ce code ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    X = 1
    def Run ():
     X = X + 1 # La variable X est globale mais on n'a pas défini "global X" !!!.
     print "Run X is ", X

  3. #3
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Merci

    Je crois que je n'etais pas clair quand je voulais dire une fonction qui en contient une autre je voulais dire ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    X=1
     
    def afficher():
    	print X
     
    def test():
    	X=3
    	afficher()
     
     
    test()
     
    1
    Je ne comprend pas pourquoi cela m'affiche 1 pour moi il devait afficher 3

    un autre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     X=1
     
    def test():
    	X=3
    	def afficher():
    		print X
    	afficher()
     
     
     test()
    3
    pourquoi la il m'affiche 3 et non 1

  4. #4
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    le principe une fonction dans une autre s'appelle une fermeture
    sa spécificité est quel possédé sont propre espace de nom qui n'est ni global ni local mais cell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> def foo():
    ...     a = []
    ...     def fermeture():
    ...             a.append(1)
    ...             return a
    ...     return fermeture
    ...
    >>>
    Voici une utilisation que l'ont peut en faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> myFoo = foo()
    >>> myFoo()
    [1]
    >>> myFoo()
    [1, 1]
    a est inaccessible dans l'espace de nom local ou global mais est accessible
    dans le cell de myFoo

    ont peut obtenir cette espace avec func_closure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> myFoo.func_closure
    (<cell at 0x00B28E70: list object at 0x00B29490>,)
    >>>
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  5. #5
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Citation Envoyé par pydev Voir le message
    Merci

    Je crois que je n'etais pas clair quand je voulais dire une fonction qui en contient une autre je voulais dire ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    X=1
     
    def afficher():
    	print X
     
    def test():
    	X=3
    	afficher()
     
     
    test()
     
    1
    Je ne comprend pas pourquoi cela m'affiche 1 pour moi il devait afficher 3

    un autre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     X=1
     
    def test():
    	X=3
    	def afficher():
    		print X
    	afficher()
     
     
     test()
    3
    pourquoi la il m'affiche 3 et non 1
    pourquoi obtient-on des resultat different dans ces 2 exemples

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Dans le premier cas, la fonction afficher affichera la valeur de la variable globale X, dans le deuxième cas, celle de la variable "locale" X, en effet le X = 3 dans la fonction ne modifie en aucun cas la variable globale X, mais définit une variable locale X valant 3.
    Si tu veux modifier la variable globale, il faut ajouter un global X au début du corps de ta fonction.
    EDIT: C'est dans le tutoriel de Swinnen, que je te conseille de lire : http://python.developpez.com/cours/T...Chapitre7#L7.2

  7. #7
    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
    Et j'ajouterais que si tu veux éviter les problèmes de compréhension à long terme de ton code, évite les mélanges de variables locale et globale de même nom, voir même évite dans la mesure du possible les variables globales ^^

    Il est d'après moi largement préférable dans le cas de valeurs globales de passer par le pattern du Singleton.

  8. #8
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    J'ai deja lu les 3/4 tuto le Swinnen bon tutoriel pour debuter mais ne rentre pas dans les details..(Au fait je recherche un autre livre qui soit plus developpe)
    et j'ai reverifie il ne traite pas ce cas

    Dans le premier cas, la fonction afficher affichera la valeur de la variable globale X, dans le deuxième cas, celle de la variable "locale" X, en effet le X = 3 dans la fonction ne modifie en aucun cas la variable globale X, mais définit une variable locale X valant 3.
    Donc il faut toujours revenir a l'endoit ou la fonction a ete cree ?

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Concernant le tuto de Swinnen, je pense que si tu n'as pas compris ça, ce n'est pas encore la peine de vouloir chercher dans les détails, je te conseille de relire la section 7.2 (cf lien ci-dessus), qui à mon avis explique suffisamment.

    Concernant ta question, je ne comprends pas ce que tu veux dire par là.

  10. #10
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par pydev Voir le message
    .(Au fait je recherche un autre livre qui soit plus developpe)
    Un bon livre, disponible gratuitement en pdf.
    http://diveintopython.org/

  11. #11
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Citation Envoyé par oiffrig Voir le message
    Concernant le tuto de Swinnen, je pense que si tu n'as pas compris ça, ce n'est pas encore la peine de vouloir chercher dans les détails, je te conseille de relire la section 7.2 (cf lien ci-dessus), qui à mon avis explique suffisamment.

    Concernant ta question, je ne comprends pas ce que tu veux dire par là.
    Je voulais dire que le tuto de Swinnen ne traite pas ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    X=1
     
    def test():
    	X=3
    	def afficher():
    		print X
    	afficher()
     
     
     test()
    3
    le cas ou une fonction est defini dans une autre

    question : est ce que X(X=3) est considere comme variable locale par rapport a la fonction afficher ? Je sais que la variable X ( X=3)est locale a test() mais est-elle aussi locale a afficher()?

    J'espere avoir ete clair

  12. #12
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Le plus simple pour avoir la réponse serait de tester par toi-même, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> X = 1
    >>> 
    >>> def test():
    ...     X = 3
    ...     def changer():
    ...         X = 5
    ...     changer()
    ...     print(X)
    ... 
    >>> test()
    3
    De manière générale, tu peux accéder en lecture les variables définies dans un "scope" plus large que celui où tu es, mais si tu les redéfinis sans utiliser global, alors elles deviennent locales.

    Seuls les objets peuvent être modifiés dans un scope extérieur. En fait tu ne changes pas la variable, mais tu appelles simplement une méthode dessus.

    Ainsi, le code suivant altère la variable globale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> Y = []
    >>> def test():
    ...     Y.append("Salut")
    ... 
    >>> test()
    >>> Y
    ['Salut']
    Attention cependant avec les variables globales... le comportement est parfois étrange comme le montre l'exemple ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> x = 1
    >>> 
    >>> def test():
    ...     x = 3
    ...     def changer():
    ...         global x
    ...         x = 5
    ...     changer()
    ...     print(x)
    ... 
    >>> test()
    3
    >>> x
    5

  13. #13
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    ok merci

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

Discussions similaires

  1. Gérer des variables locales/globales
    Par Sweeny94 dans le forum Simulink
    Réponses: 20
    Dernier message: 07/11/2013, 11h34
  2. Bash et les variables locales/globales
    Par Yokav dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 31/05/2012, 18h10
  3. Variable, local ou global ?
    Par Expender dans le forum Débuter
    Réponses: 4
    Dernier message: 11/06/2007, 16h12
  4. variables locales ou globales?
    Par molesqualeux dans le forum C
    Réponses: 20
    Dernier message: 09/11/2005, 23h03
  5. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22

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