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 :

comment définir une variable globale.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut comment définir une variable globale.
    Bonjour,

    estt-il possible de définir une variiale globale pour tout un script Python ?


    Premier essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = "toto"
    def mafonc():
         print(x)   #  renvoie blanc.


    Second essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    global x
    x = "toto"
    def mafonc():
         print(x)   #  renvoie blanc.

    Troisième essai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    x = "toto"
    def mafonc():
         global x
         print(x)   #  renvoie blanc.

    ## En fait ma question est simple : est-il possible de rendre la variable x visible dans toutes les fonctions de mon script.

    Merci

    Désolé, je ne sais pas supprimer ce post car j'ai résolu mon problème.
    Gégé

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par GérardMartinelli Voir le message
    estt-il possible de définir une variiale globale pour tout un script Python ?
    Pour les autres alors!
    Lancez l'interpréteur Python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> def f():
    ...     print(x)
    ...
    >>>
    d'où peut bien sortir le x passé en paramètre à print: de l'espace de noms globals().
    D'ailleurs c'est ce qu'indique Python lorsqu'on essaie d'exécuter la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in f
    NameError: name 'x' is not defined
    Et si on assigne quelque chose à x avant d'appeler la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> x = 123
    >>> f()
    123
    Python s'y retrouve: une variable "globale" doit être définie (en lui assignant un objet) avant l'appel de la fonction qui en a besoin.

    Ceci dit, même si on ne peut pas toujours, il est important d'éviter d'écrire des fonctions qui dépendent de variables globales. Les fonctions peuvent prendre des paramètres qu'on pourra passer en argument... et il sera plus raisonnable d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def f(x):
    ...     print(x)
    ...
    >>> f(123)
    123
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par GérardMartinelli Voir le message
    est-il possible de définir une variiale globale pour tout un script Python ?
    Oui. Toute variable définie en dehors des fonctions est implictement globale (donc accessible depuis toutes les fonctions). Sauf qu'elle est en lecture seule. L'instruction global sert juste à la rendre modifiable (à mettre bien évidemment dans la fonction qui veut modifier la variable).

    Citation Envoyé par GérardMartinelli Voir le message
    ## En fait ma question est simple : est-il possible de rendre la variable x visible dans toutes les fonctions de mon script.
    A aucun moment de tes essais on te voit appeler la fonction...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    L'instruction global sert juste à la rendre modifiable (à mettre bien évidemment dans la fonction qui veut modifier la variable).
    On peut modifier une liste (et tout objet mutable) sans "global"...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 457
    Par défaut
    Je suis étonné que personne gueule parce qu'il utilise une variable globale, sur les habitudes en programmation. J'ai pas dit que j'allais le faire, je suis juste surpris car j'ai vu nombre de posts incendiaires sur divers sites ^^

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par daerlnaxe Voir le message
    Je suis étonné que personne gueule parce qu'il utilise une variable globale, sur les habitudes en programmation. J'ai pas dit que j'allais le faire, je suis juste surpris car j'ai vu nombre de posts incendiaires sur divers sites ^^
    Les variables "globales" peuvent poser problème lorsqu'elles sont mises à jour par un tas de fonctions. En cas de problème, il faut tracer toutes ces fonctions (et leurs appelants) pour savoir le pourquoi du comment de leur mise à jour et la séquence d'appels qui les a provoquée.

    C'est fastidieux et on s'y prend les pieds (ou la tête).

    Une solution pour limiter la casse est de partitionner l'espace de nommage avec un préfixe: la variable xyz_truc pourront être modifiées par les fonctions xyz_... et les autres fonctions seront "suspectes" (celles qui ne commencent pas par xyz_).
    Avec le temps, la plupart des langages ont des "namespaces" qui partitionnent l'espace de noms de façon "statique" en regroupant fonctions et variables qui vont avec.

    La POO permet en plus d'avoir un partitionnement plus fin et "dynamique".

    Avec Python, la portée des variables dites "globales" est limitée au module où elles sont définies (les modules définissent une partition de l'espace de nom et sont des "namespaces" statiques)... et, de ce fait, les variables globales n'existent pas (au sens où on l'entendait dans les années 70s du siècle dernier).

    Rien n'interdit d'écrire un "gros" module avec plein de variables et des tas de fonctions qui iront les mettre à jour un peu n'importe comment.... Vu les difficultés à mettre au point ce genre de code, on apprendra vite à partitionner (créer des modules n'est pas si compliqué).

    Il y a bien quelques hystériques qui se manifestent lorsqu'ils voient le mot clef global. Ce n'est pas très sympa vis a vis des débutants qui n'ont pas encore appris mieux... mais il faut bien s'agiter pour montrer qu'on "sait" un peu plus que...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre expérimenté
    Homme Profil pro
    Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique
    Inscrit en
    Décembre 2014
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur Systèmes, Clouds et Réseaux /CAO/DAO/Ingénierie Electrotechnique

    Informations forums :
    Inscription : Décembre 2014
    Messages : 457
    Par défaut
    Ah mais pas de soucis, juste qu'il y a encore peu j'ai assisté à une prise de bec sur le sujet, et que j'ai voulu introduire un dialogue sur la sémantique du terme au regard des besoins quand on développe une application. Je partage ton avis sur des réactions totalement disproportionnées, qui en effet n'aideront jamais un débutant. Et là du coup ça m'amuse car l'intervalle est quand même assez court de voir des gens posés sur le sujet.

  8. #8
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 920
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Citation Envoyé par daerlnaxe Voir le message
    Je suis étonné que personne gueule
    Perso, depuis que ma femme est partie je ne gueule plus ...

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    On peut modifier une liste (et tout objet mutable) sans "global"...
    Exact...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> l=[123,]
    >>> def fct():
    ...	print(l)
    ...	l.append("toto")
    ...
    >>> fct()
    [123]
    >>> print(l)
    [123, 'toto']

    ... mais on ne peut pas la réassigner...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> l=[123,]
    >>> def fct():
    ...	print(l)
    ...	l="xxx"
    ...
    >>> fct()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in fct
    UnboundLocalError: local variable 'l' referenced before assignment

    ... sauf à passer par global.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> l=[123,]
    >>> def fct():
    ...     global l
    ...     print(l)
    ...     l="xxx"
    ... 
    >>> fct()
    [123]
    >>> print(l)
    xxx

    C'est vrai j'ai parlé de modification mais je pensais à l'écriture habituelle var=valeur qui est une assignation mais que dans le langage populaire informatique on nomme aussi "modification"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Oui. Toute variable définie en dehors des fonctions est implictement globale (donc accessible depuis toutes les fonctions). Sauf qu'elle est en lecture seule. L'instruction global sert juste à la rendre modifiable (à mettre bien évidemment dans la fonction qui veut modifier la variable).


    A aucun moment de tes essais on te voit appeler la fonction...
    Oui bien sûr, j'avais compris cela c'est pourquoi je voulais supprimer le post. Mais apparemment plusieurs personnes ont répondu quand même, ce qui n'était pas inutile.

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

Discussions similaires

  1. [C#] Comment créer une variable globale?
    Par FraktaL dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/05/2017, 14h10
  2. Réponses: 2
    Dernier message: 29/06/2006, 13h58
  3. [sql] comment utiliser une variable global
    Par imedg dans le forum Oracle
    Réponses: 21
    Dernier message: 02/05/2006, 15h21
  4. Comment déclarer une variable globale
    Par davkick dans le forum C
    Réponses: 13
    Dernier message: 20/05/2005, 18h50

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