Bien que le découpage de listes puisse sembler créer de nouvelles copies, la vérité sous-jacente est tout à fait différent. Le mécanisme de découpage de Python préserve les références aux éléments de la liste, plutôt que de les dupliquer. Ce comportement s'applique à la fois aux valeurs immuables et mutables.
Considérez une liste contenant des objets entiers :
a = [1000 + 1, 1000 + 1, 1000 + 1]
Bien qu'il ait des valeurs identiques, chaque entier est un objet distinct avec un identifiant unique :
map(id, a) [140502922988976, 140502922988952, 140502922988928]
Découper la liste :
b = a[1:3]
révèle que les identifiants des objets dans la tranche sont identiques à ceux de la liste originale. Aucune copie n'a été effectuée.
De même, les valeurs mutables telles que les dictionnaires se comportent de la même manière :
a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']] map(id, a) [4380777000, 4380712040] map(id, a[1:] ... ) [4380712040]
While les références d'objet sont copiées lors du découpage, leur taille reste constante (8 octets sur une machine 64 bits). De plus, chaque liste comporte une surcharge de 72 octets. Cette surcharge augmente à chaque tranche créée :
for i in range(len(a)): x = a[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))
Malgré la surcharge, le découpage des listes reste une approche plus efficace que la création de listes complètement nouvelles.
Python n'offre pas de moyen natif de créer des vues de liste. Cependant, les tableaux numpy offrent une solution pour économiser de la mémoire en partageant la mémoire entre les tranches et le tableau d'origine. Les modifications apportées au tableau d'origine sont reflétées dans les tranches :
import numpy a = numpy.arange(3) b = a[1:3] a[2] = 1001 b # Output: array([ 1, 1001])
Cependant, l'utilisation des vues nécessite une attention particulière pour éviter des modifications involontaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!