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

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

Susan Sarandon
Libérer: 2024-11-06 07:01:03
original
1060 Les gens l'ont consulté

 Does Python List Slicing Create Copies of Objects?

Découpage de listes en Python : maintien de l'intégrité des objets

Bien qu'il puisse sembler logique de supposer que le découpage de listes en Python crée des copies des objets contenus, ce n’est pas réellement le cas. Au lieu de cela, le découpage produit simplement de nouvelles listes faisant référence aux mêmes objets sous-jacents. Cette reconnaissance joue un rôle crucial dans la compréhension du mécanisme de découpage de liste de Python.

Immuabilité en action

Considérez une liste d'entiers :

[1000 + 1, 1000 + 1, 1000 + 1]
Copier après la connexion

Bien qu'ils aient la même valeur, ces objets sont des entités distinctes avec des identifiants uniques, comme en témoigne le suivant :

map(id, [1000 + 1, 1000 + 1, 1000 + 1])
Copier après la connexion

Le découpage de cette liste maintient l'intégrité de ces références :

b = [1000 + 1, 1000 + 1, 1000 + 1][1:3]
map(id, b)
Copier après la connexion

Le résultat des deux opérations cartographiques est identique, confirmant que le slice ne génère pas de nouvelles copies du entiers.

Les objets mutables se comportent De même

Un comportement similaire est observé avec des objets mutables tels que des dictionnaires ou des listes :

a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']]
map(id, a[1:])
Copier après la connexion

La tranche conserve toujours les références d'origine, démontrant que le découpage est une opération sans copie. .

Les frais généraux de Copie

Bien que le découpage n'implique pas la copie des objets eux-mêmes, il copie les références. Chaque référence occupe 8 octets sur les machines 64 bits, et chaque liste comporte 72 octets supplémentaires de surcharge :

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

Néanmoins, cette surcharge n'est généralement pas une préoccupation significative pour la plupart des applications.

Une alternative : Views

Bien que Python ne dispose pas d'un support direct pour vues, des options alternatives telles que les tableaux numpy peuvent être utilisées pour obtenir une optimisation de la mémoire. Le découpage des tableaux numpy crée des vues qui partagent la mémoire avec l'original, réduisant ainsi la surcharge mais introduisant un risque de modifications involontaires.

En résumé, le découpage des listes en Python préserve les références aux objets contenus, évitant ainsi des opérations de copie coûteuses. Ce mécanisme simplifie la maintenance du code en garantissant que les tranches reflètent les modifications apportées à la liste d'origine. Bien que la surcharge de mémoire soit un facteur à prendre en compte, elle ne constitue généralement pas une préoccupation majeure pour la plupart des applications pratiques.

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