web-dev-qa-db-fra.com

Comment l'affectation fonctionne avec Python slice list?

Le document Python indique que le découpage d'une liste renvoie une nouvelle liste.
Maintenant, si une "nouvelle" liste est renvoyée, j'ai les doutes suivants concernant "Affectation aux tranches"

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

Maintenant, la sortie serait:

[4, 5, 3] 
  1. Comment quelque chose qui retourne quelque chose peut-il venir du côté gauche de l'expression?
  2. Oui, j'ai lu les documents et cela dit que c'est possible, maintenant que le découpage d'une liste renvoie une "nouvelle" liste, pourquoi la liste d'origine est-elle modifiée? Je ne suis pas en mesure de comprendre la mécanique derrière cela.
78
Kartik Anand

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

1) tranchage:

b = a[0:2]

Cela crée une copie de la tranche de a et l'affecte à b.

2) affectation de tranche:

a[0:2] = b

Ceci remplace la tranche de a par le contenu de b.

Bien que la syntaxe soit similaire (j'imagine par conception!), Ce sont deux opérations différentes.

93
NPE

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

En spécifiant a[0:2] sur le côté gauche du = opérateur, vous indiquez Python que vous souhaitez utiliser Slice Assignment . Slice Assignment est une syntaxe spéciale pour les listes , où vous pouvez insérer, supprimer ou 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 affectée, changeant ainsi la longueur de la séquence cible, si la séquence cible le permet. - source

L'affectation de tranche fournit une fonction similaire à déballage du tuple . Par exemple, a[0:1] = [4, 5] est équivalent à:

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

Avec Tuple Unpacking, vous pouvez modifier des listes non séquentielles:

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

Cependant, le déballage du tuple est limité au remplacement, car vous ne pouvez pas insérer ou supprimer des éléments.

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

52
Casey Kuball

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

3
fraxel