La documentation Python dit que le découpage d'une liste renvoie une nouvelle liste.
Maintenant, si une "nouvelle" liste est renvoyée, j'ai les questions suivantes liées à "Affectation aux tranches"
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Maintenant, la sortie serait:
[4, 5, 3]
- Comment quelque chose qui renvoie quelque chose peut-il venir du côté gauche de l'expression?
- Oui, j'ai lu la documentation et cela dit que c'est possible, maintenant que le découpage d'une liste renvoie une "nouvelle" liste, pourquoi la liste originale est-elle modifiée? Je ne suis pas en mesure de comprendre les mécanismes derrière cela.
a[0] = 4
ferait?=
, donc au lieu de le rejeter comme syntaxe invalide, python le transforme en quelque chose qui ressemble plus à ce à quoi vous pourriez vous attendre. Puisque python n'a pas de références, cela ne fonctionnerait pas pour que le résultat d'une tranche modifie la liste d'origine. Vous en obtenez une copie. Si vous avez fourni plus d'informations sur votre application, nous pourrons peut-être mieux vous aider à faire les choses de manière «pythonique». :)Réponses:
Vous confondez deux opérations distinctes qui utilisent une syntaxe très similaire:
1) tranchage:
Cela fait une copie de la tranche de
a
et l'attribue àb
.2) affectation des tranches:
Cela remplace la tranche de
a
par le contenu deb
.Bien que la syntaxe soit similaire (j'imagine par conception!), Ce sont deux opérations différentes.
la source
start=1
,stop=None
. Cela évitera toute copie et utilisera une évaluation paresseuse (dans votre cas, un accès paresseux à la liste d'origine).Lorsque vous spécifiez
a
sur le côté gauche de l'=
opérateur, vous utilisez l' affectation normale de Python , qui modifie le noma
dans le contexte actuel pour pointer vers la nouvelle valeur. Cela ne change pas la valeur précédente vers laquellea
pointait.En spécifiant
a[0:2]
sur le côté gauche de l'=
opérateur, vous indiquez à Python que vous souhaitez utiliser l' affectation de tranche . L'affectation de tranche est une syntaxe spéciale pour les listes, dans laquelle vous pouvez insérer, supprimer ou remplacer le contenu d'une liste:Insertion :
Suppression :
Remplacement :
Remarque:
L'affectation de tranche fournit une fonction similaire à la décompression de tuples . Par exemple,
a[0:1] = [4, 5]
équivaut à:Avec Tuple Unpacking, vous pouvez modifier des listes non séquentielles:
Cependant, le déballage de 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
c'est la même liste exacte. Python fournit simplement un bon sucre syntaxique pour modifier une liste sur place.la source
a[:] = some_list
équivalent àa = some_list[:]
oua = some_list
?a[:] = some_list
définit chaque élément dea
comme étant celui desome_list
. Faire l'un ou l'autre de ceux que vous mentionnez changerait ce quia
est. Par exemple:a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. La dernière ligne serait False si elle changeaita
la valeur de, plutôt que de la muter.Je suis tombé sur la même question auparavant et elle est liée à la spécification du langage. Selon les déclarations de mission ,
Si le côté gauche de l'affectation est un abonnement, Python appellera
__setitem__
cet objet.a[i] = x
équivaut àa.__setitem__(i, x)
.Si le côté gauche de l'affectation est slice, Python appellera également
__setitem__
, mais avec des arguments différents:a[1:4]=[1,2,3]
équivaut àa.__setitem__(slice(1,4,None), [1,2,3])
C'est pourquoi la tranche de liste sur le côté gauche de '=' se comporte différemment.
la source
En découpant le côté gauche d'une opération d'affectation, vous spécifiez les éléments à affecter.
la source