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

Linda Hamilton
Libérer: 2024-11-10 03:04:02
original
569 Les gens l'ont consulté

 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]
Copier après la connexion

Bien qu'il ait des valeurs identiques, chaque entier est un objet distinct avec un identifiant unique :

map(id, a)
[140502922988976, 140502922988952, 140502922988928]
Copier après la connexion

Découper la liste :

b = a[1:3]
Copier après la connexion

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]
Copier après la connexion

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)))
Copier après la connexion

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])
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal