132 votes

Comment fonctionne l'affectation avec les tranches de liste ?

La documentation de Python indique que le découpage d'une liste renvoie une nouvelle liste.
Si une "nouvelle" liste est renvoyée, j'ai les questions suivantes concernant l'"affectation aux tranches".

a = [1, 2, 3]
a[0:2] = [4, 5]
print a

La sortie serait alors la suivante :

[4, 5, 3] 
  1. Comment quelque chose qui renvoie quelque chose peut-il venir du côté gauche de l'expression ?
  2. Oui, j'ai lu la documentation et elle dit que c'est possible, mais puisque le découpage d'une liste renvoie une "nouvelle" liste, pourquoi la liste d'origine est-elle modifiée ? Je n'arrive pas à comprendre la mécanique derrière cela.

154voto

NPE Points 169956

Vous confondez deux opérations distinctes qui utilisent une syntaxe très similaire :

1) le tranchage :

b = a[0:2]

Cela permet d'obtenir une copie de la tranche de a et l'affecte à b .

2) l'affectation des tranches :

a[0:2] = b

Le présent remplace la tranche de a avec le contenu de b .

Bien que la syntaxe soit similaire (j'imagine que c'est voulu !), il s'agit de deux opérations différentes.

90voto

Darthfett Points 1645

Lorsque vous spécifiez a sur le côté gauche de l'écran = vous utilisez l'opérateur Python affectation normale qui modifie le nom a dans le contexte actuel pour pointer vers la nouvelle valeur. Cela ne modifie pas la valeur précédente à laquelle a pointait du doigt.

En spécifiant a[0:2] sur le côté gauche de l'écran = vous indiquez à Python que vous voulez utiliser l'opérateur affectation des tranches . L'affectation de tranches est une syntaxe spéciale pour les listes, qui permet d'insérer, de supprimer ou de remplacer le contenu d'une liste :

Insertion :

>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]

Suppression :

>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

Remplacement :

>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

Remarque :

La longueur de la tranche peut être différente de la longueur de la séquence attribuée. séquence attribuée, ce qui modifie la longueur de la séquence cible, si le la séquence cible le permet. - source

L'affectation des tranches offre une fonction similaire à celle de l'affectation des déballage de tuple . Par exemple, a[0:1] = [4, 5] est équivalent à :

# Tuple Unpacking
a[0], a[1] = [4, 5]

Le déballage de tuple permet de modifier des listes non séquentielles :

>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

Cependant, le déballage de tuple est limité au remplacement, car il n'est pas possible d'insérer ou de supprimer des éléments.

Avant et après toutes ces opérations, a est exactement la même liste. Python fournit simplement un sucre syntaxique agréable pour modifier une liste sur place.

35voto

Stan Points 708

J'ai déjà rencontré la même question et elle est liée à la spécification de la langue. D'après déclarations d'affectation ,

  1. Si le côté gauche de l'affectation est l'abonnement, Python appellera __setitem__ sur cet objet. a[i] = x est équivalent à a.__setitem__(i, x) .

  2. Si le côté gauche de l'affectation est une tranche, Python appellera également __setitem__ mais avec des arguments différents : a[1:4]=[1,2,3] est équivalent à a.__setitem__(slice(1,4,None), [1,2,3])

C'est pourquoi la tranche de liste à gauche de "=" se comporte différemment.

5voto

fraxel Points 13844

En effectuant des coupes sur le côté gauche d'une opération d'affectation, vous spécifiez les éléments à affecter.

2voto

thing10 Points 1

Quand vous l'avez fait a[0:2] = [4,5] , vous avez affecté la partie gauche de l'écran à l'application de la méthode de l'analyse de l'information. = (la tranche a[0:2] ) la valeur du côté droit du = , [4,5] .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X