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 :

UnboundLocalError dans une fonction x = 2 VS x = x + 1


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut UnboundLocalError dans une fonction x = 2 VS x = x + 1
    Bonjour,

    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
     
    >>> a = 1
    >>> def f():
    ...     return a
    ...
    #La variable est accessible dans la function a
    >>> f()
    1
    >>> def f():
    ...     return a + 1
    ...
    >>> f()
    2
    # On peut affecter la valeur 2 à a mais à l'exterieur de la fonction a reste egal a 1
    >>> def f():
    ...     a = 2
    ...     return a
    ...
    >>> f()
    2
    # Ca ressemble à a = 2 mais pour ce cas Python remonte une erreur, je comprends pas la vrai différence entre a = 2 et a = a + 1
    >>> def f():
    ...     a = a + 1
    ...     return a
    ...
    >>> f()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in f
    UnboundLocalError: local variable 'a' referenced before assignment
    Pourriez vous m'expliquer s'il vous plait la différence dans le code entre a = 2 et a = a + 1

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par brunofl Voir le message
    Pourriez vous m'expliquer s'il vous plait la différence dans le code entre a = 2 et a = a + 1
    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = 1
    >>> def f():
    ...     return a
    ...
    >>> def f():
    ...     return a + 1
    vous accédez dans le corps de la fonction à une variable "globale" (en lecture).
    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # On peut affecter la valeur 2 à a mais à l'exterieur de la fonction a reste egal a 1
    >>> def f():
    ...     a = 2
    ...     return a
    ...
    l'assignation "a = 2" crée une variable "locale" avant de retourner l'objet.
    Dans le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> def f():
    ...     a = a + 1
    ...     return a
    ...
    Vous créez une variable locale mais en lui assignant la valeur d'une variable globale ayant le même nom.
    Python n'aime pas cette confusion: faut-il modifier le "a" global? il vous force à utiliser le mot clé "global":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def f():
    ...     global a
    ...     a = a + 1
    ...     return a
    ...
    mais dans ce cas, la variable globale sera modifiée.
    Si ce n'est pas ce que vous voulez faire, autant passer un paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def f(a):
    ...     return a + 1
    ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut Python n'aime pas la confusion ?
    Merci, j'ai bien compris qu'il fallait mieux dorénavant donner en paramètre une variable global à une fonction pour éviter cette confusion.

    Petite question :
    Citation Envoyé par wiztricks Voir le message
    Python n'aime pas cette confusion:
    Existe-t-il d'autres cas où Python n'aime pas la confusion ?

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

    Citation Envoyé par brunofl Voir le message
    Existe-t-il d'autres cas où Python n'aime pas la confusion ?
    La FAQ que vous trouverez sur ce site ou sur python.org sont les endroits où sont collectées les réponses aux questions que se posent les débutants.

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

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

Discussions similaires

  1. UnboundLocalError dans une fonction
    Par piotrr dans le forum Général Python
    Réponses: 4
    Dernier message: 02/04/2007, 16h45
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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