Maison  >  Article  >  développement back-end  >  Le découpage de liste de Python crée-t-il des copies ?

Le découpage de liste de Python crée-t-il des copies ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-10 03:04:02560parcourir

 Does Python's List Slicing Create Copies?

Découper des listes en Python sans copier : une exploration

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.

Test des 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]

Minimal Memory Overhead

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.

Vues et tableaux Numpy< ;/h3>

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn