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 :

une alternative aux variables globales ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut une alternative aux variables globales ?
    Bonjour à tous

    Je suis en train d'apprendre le python grâce à l'excellent tuto de G.Swinnen. J'ai déjà un peu programmé en C, et je m'aperçois qu'en python les pointeurs n'ont pas l'air d'exister. J'aimerais savoir quels équivalents les développeurs ont conçus, et si on est obligé de passer par des variables globales. J'aimerais également avoir votre avis sur l'utilisation de ces variables globales, en cours de C notre formateur nous déconseillait toujours de les utiliser.Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    J'vais p'tet dire une bétise, mais si tu programe en orienté objet, tu n'as pluss de probleme de variable globale...
    Il me semble d'ailleur que c'est dit dans le tuto de Swinnen, quand il aborde la POO

  3. #3
    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
    Les pointeurs existent bel et bien sous python. La seule différence est qu'ils sont implicites.

    En python, tout est objet, même un nombre ou une chaîne de caractère. Il s'en suit que toutes les variables que tu manipules sont en fait des références.

    On pourrait alors croire que le code suivant imprimerait "4", puisque la fonction change semble modifier la variable via son pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def change(var):
        var = 4
     
    a = 5
    change(a)
    print(a)
    Il se trouve que certains types sous python sont immuables. C'est le cas pour les nombres, les strings, les tuples, et sans doute d'autres.


    Pour résumer, tout est objet dans python, toutes les variables sont donc des pointeurs, mais certains objets sont immuables.



    Pour ce qui est des variables globales, elles sont à éviter à tout prix.
    Les constantes sont acceptées par contre, puisque leur but est d'être global pour tenir une information commune.

    Il y a certains cas en C qui requièrent réellement des variables globales (comme errno par exemple). En python on peut toujours s'en passer.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    D'accord, merci de ta réponse très complète

    C'est un petit peu dommage que les nombres et string soient immuables, mais quand je ferais de la poo j'aurais très vite oublié ce petit désagrément^^

    Une petite chose me chagrine, du même rapport, concernant les strings.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch="test"
    ch[1]=a         #ne compile pas
    ch=ch+"er"     #compile
    c'est dû à la même chose d'après toi ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 139
    Par défaut
    héhéhé...alors la, tuto Swinnen P 125:
    "Les chaines sont des séquences non modifiables"

    Par conséquent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch[1]=a         #ne compile pas
    Ne peut pas fonctionner

    Par contre dans ta deuxieme ligne, tu ne modifie pas la chaine de charactere, mais tu ré-affecte la variable avec une nouvelle valeur et donc ca passe...

    Maintenant si ta question est pourquoi c'est intrinsequement comme ca, j'avoue que je n'en sais rien...

  6. #6
    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 scheme Voir le message
    C'est un petit peu dommage que les nombres et string soient immuables
    Ne confonds pas, si les nombres sont immuables, ça ne t'empêche en aucun cas de réaffecter une valeur aux variables.
    Pour ce qui est des strings immuables, crois-moi, tu considèreras vite ça comme une bénédiction

    @Zavonen: la conclusion de mon bout de code a disparu pdt la rédaction (j'ai été coupé...). Elle voulait bien sur illustrer que le changement à l'extérieur ne se faisait pas.

  7. #7
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    @ Antoine_935
    Tout ce que tu dis est parfaitement exact, mais le bout de code que tu utilises pour illustrer ton propos est assez malheureux, puisqu'il va à l'encontre de ce que tu affirmes.
    Cet exemple est celui que l'on utilise toujours en C pour montrer l'utilité des pointeurs (une fonction standard ne peut modifier ses arguments à cause du passage par valeurs par défaut en C).
    Cependant,même si les arguments sont passés en références, les fonctions Python évaluent leurs arguments avant d'évaluer le corps de la fonction.
    Ainsi ton exemple, pour moi, ne marche pas...
    Si je devais expliquer à quelqu'un qu'il est possible par un appel de fonction de modifier la valeur d'une variable, et pour illustrer ton propos sur les variables 'mutables' j'utiliserais plutôt:
    Code Python : 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
    # -*- coding: utf-8 -*-
     
    def changeglob(s):
        """changer une var. globale immuable"""
        globals()[s]=4
     
    def changeliste(L):
        """changer un objet 'mutable'"""
        L[0]=1
     
    a = 5
    L=[2]
     
    changeglob('a')
    changeliste(L)
    print a
    print L
    Toutefois toute personne venant de C te signifierait qu'en C également les tableaux sont passés par référence.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut
    Oui on peut les réaffecter, mais la on ne passe pas par une fonction. Zovanen, en passant par global variable, on ne retourne pas justement a des variables globales ?

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    tu peux utiliser un dictionnaire pour 'globaliser' des variables; l'inconveniant étant la syntax.

Discussions similaires

  1. alternatives aux variables globales
    Par looping dans le forum Langage
    Réponses: 7
    Dernier message: 21/03/2013, 14h03
  2. Astuce pour accès aux variables globales depuis une fonction
    Par manur0 dans le forum Général Python
    Réponses: 0
    Dernier message: 03/09/2009, 14h30
  3. Je cherche une alternative aux frames
    Par Gizmil dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 02/11/2007, 08h40
  4. Je cherche une alternative aux frames
    Par Gizmil dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/10/2007, 14h25
  5. Point d'entrée d'une DLL et Variable globale
    Par David Fouejio dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/06/2007, 10h43

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