Outils personnels
Vous êtes ici : Accueil Python Bonnes pratiques et astuces Python Les variables

Les variables

Par David Goodger - Dernière modification 17/05/2008 11:23
Contributeurs : David Larlet
CC BY-SA

Variables intermédiaires

Dans les autres langages :

temp = a
a = b
b = temp

En Python :

b, a = a, b

Vous l'avez peut-être déjà rencontré mais savez vous comment ça fonctionne ?

  • La virgule est la syntaxe de construction du tuple.
  • Un tuple est créé à droite (tuple packing).
  • Un tuple en est la cible à gauche (tuple unpacking).

La partie à droite est unpackée dans les noms de tuple de la partie à gauche.

D'autres exemples:

>>> l =['David', 'Pythonista', '+1-514-555-1234']
>>> name, title, phone = l
>>> name
'David'
>>> title
'Pythonista'
>>> phone
'+1-514-555-1234'

Utile dans les boucles sur des données structurées (la variable l ci-dessus a été conservée) :

>>> people = [l, ['Guido', 'BDFL', 'unlisted']]
>>> for (name, title, phone) in people:
...     print name, phone
...
David +1-514-555-1234
Guido unlisted

Chaque item de people est unpacké dans le tuple (name, title, phone).

Il est aussi possible de faire le chemin inverse, il faut juste s'assurer d'avoir la même structure à droite et à gauche :

>>> david, (gname, gtitle, gphone) = people
>>> gname
'Guido'
>>> gtitle
'BDFL'
>>> gphone
'unlisted'
>>> david
['David', 'Pythonista', '+1-514-555-1234']

Les autres langages ont des "variables"

Dans de nombreux autres langages, assigner une variable revient à mettre une valeur dans une boîte.

int a = 1;

int a = 1;

La boîte "a" contient maintenant un integer 1.

Assigner une autre valeur à la même variable remplace le contenu de la boîte :

a = 2;

a = 2;

Maintenant la boîte "a" contient un integer 2.

Assigner une variable à une autre crée une copie de la valeur et la met dans une nouvelle boîte :

int b = a;

a = 2;

int b = a;

"b" est une seconde boîte, avec une copie de l'entier 2. La boîte "a" en a une copie séparée.

Python a des "noms"

En Python, un "nom" ou "identifiant" est comme une étiquette attachée à un objet.

a = 1

a = 1

Ici, un objet integer 1 a une étiquette appelée "a".

Si on réassigne "a", on déplace juste l'étiquette sur un autre objet :

a = 2

a = 2

1

Maintenant le nom "a" est attaché à un objet entier 2.

L'objet entier 1 n'a plus le tag "a". Il peut encore exister mais on n'y a plus accès via le nom "a". (Lorsqu'un objet n'a plus aucune référence ou étiquette, il est supprimé de la mémoire.)

Si l'on assigne un nom à un autre, on attache juste une autre étiquette à un objet existant :

b = a

b = a

Le nom "b" est juste une seconde étiquette attachée au même objet que "a".

Bien que l'on réfère communément aux "variables" en Python (car c'est une terminologie commune aux autres langages), on manipule vraiment de "noms" ou "identifiants". En Python, les "variables" sont des étiquettes pour des valeurs, non des boîtes nommés.

Si vous ne comprenez rien au reste de ce tutoriel, j'espère que vous aurez$ au moins retenu la façon dont les noms fonctionnent. Une bonne compréhension vous permettra d'apprendre rapidement et d'éviter des erreurs comme celle-ci:

Valeurs de paramètres par défaut

C'est une erreur courante que les débutants font souvent. Même les développeurs plus expérimentés la font s'ils n'ont pas compris comment fonctionnent les noms en Python.

def bad_append(new_item, a_list=[]):
    a_list.append(new_item)
    return a_list

Le problème ici c'est que la valeur par défaut a_list, une liste vide, est évaluée lors de la définition de la fonction. Ainsi à chaque fois que vous appelez la fonction vous obtenez la même valeur par défaut. Essayez plusieurs fois :

>>> print bad_append('one')
['one']

>>> print bad_append('two')
['one', 'two']

Les listes sont modifiables, vous pouvez modifier leur contenu. La bonne manière d'avoir une liste par défaut (ou dictionnaire, ou set) est de la créer au moment du lancement, au sein de la fonction :

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list
Actions sur le document