Python: Liste: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
Line 43: Line 43:
print a,b
print a,b
</source>
</source>
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
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 [:]
<source lang="py">
<source lang="py">
a = [3,2,1,0]
a = [3,2,1,0]
Line 52: Line 52:
print a,b,c
print a,b,c
</source>
</source>
 
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:
deepcopy
<source lang="py">
a = [ [2,3] for i in range(4) ]
b = list(a)
b[2][0] = 5
print a,b
</source>
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
<source lang="py">
from copy import deepcopy
a = [ [2,3] for i in range(4) ]
b = deepcopy(a)
b[2][0] = 5
print a,b
</source>
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.
<source lang="py">
from copy import copy
a = [ [2,3] for i in range(4) ]
b = copy(a)
...
</source>


==== Génération de listes ====
==== Génération de listes ====

Revision as of 12:03, 15 July 2015

Les listes

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)
...

Génération de listes

Méthodes utiles pour les listes

Les dictionnaires