Python: Liste
Initialisation
Une liste est un tableau ordonné qui contient des pointeurs vers des objets qui peuvent être simplement des données numériques (entiers ou réels) ou des choses plus compliquées comme des nombres complexes ou même des listes. Pour créer une liste vide, on peut faire
a = list()
a = []
print a # affiche la liste
On peut définir une liste en explicitant son contenu, les éléments sont alors séparés par des virgules. Voici un exemple de liste au contenu homogène puis un avec un contenu
a = [1,4,2,3] # une liste d'entiers
a = [ 2, complex(1,3), 4.5, ['a','b','c'] ] # une liste au contenu inhomogène
Indiçage
On accède aux éléments de la liste à l'aide de l'opérateur d'indiçage [] comme en C. De même qu'en C, le premier indice est 0. Cet opérateur permet à la fois d'accéder au contenu stocké à la ième place, via a[i], mais aussi de le modifier.
a = [3,2,1,0]
print a[0],a[1],a[2],a[3]
a[0] = 'a'
print a
Le nombre d'éléments est accessible par la méthode len() selon
print len(a)
Copie d'une liste
Il faut faire attention au fait qu'en Python, qui a un typage dynamique, l'affection suivante fait que la liste b va pointer vers le contenu de a:
a = [3,2,1,0]
b = a
Si l'on modifie un élément de b, le contenu est changé et donc les éléments de a également
a = [3,2,1,0]
b = a
b[2] = 5
print a,b
Pour réellement créer une copie indépendante, il faut générer une nouvelle liste en dupliquant le contenu de a. Il y a deux façons simple de le faire: avec l'initialisateur list() ou l'indiçage du contenu en entier via l'opération [:]
a = [3,2,1,0]
b = list(a)
b[2] = 5
c = a[:]
c[1] = -3
print a,b,c
En fait, il reste cependant un problème dans le cas où la liste contient des éléments qui sont des objets plus compliqués que les types de base (entiers, réels,...), en particulier des listes. Regardons en effet le résultat d'une copie d'une liste de listes:
a = [ [2,3] for i in range(4) ]
b = list(a)
b[2][0] = 5
print a,b
On voit que le contenu de a a été modifié car la copie a copié comme nouvel élément de b l'adresse de la liste élément de a. Pour effectuer une copie complète du contenu à tous les niveaux, Python offre une fonction deepcopy présente dans la bibliothèque copy du standard. Refaire alors
from copy import deepcopy
a = [ [2,3] for i in range(4) ]
b = deepcopy(a)
b[2][0] = 5
print a,b
Noter que cette bibliothèque offre également une fonction copy qui fait la même chose qu'avec list() mais avec un nom plus évocatif et il s'agit surtout d'une méthode plus générique et ré-définissable pour des objets plus complexes.
from copy import copy
a = [ [2,3] for i in range(4) ]
b = copy(a)
...