En relation, effacer une liste n'est possible qu'en faisant del pop [:] ou pop [:] = [], et non pop.clear () .. (comme vous le faites avec les dictionnaires).
C'est un exemple de notation de tranche, et ce qu'elle fait dépend du type de population. Si populationest une liste, cette ligne créera une copie superficielle de la liste. Pour un objet de type tupleou a str, il ne fera rien (la ligne fera de même sans [:]), et pour un tableau (disons) NumPy, il créera une nouvelle vue sur les mêmes données.
Juste au cas où: la tranche renvoie une copie superficielle.
André Caron
4
@ilius: C'est peut l.copy()- être plus lisible, mais ça ne fonctionnera pas.
Sven Marnach
13
list(l)fonctionne toujours, est plus lisible et est garanti de renvoyer une copie même avec quelque chose commenumpy.array
Rosh Oxymoron
1
@Eli: Oui, à côté list.clear(). Cela prendra du temps, cependant, jusqu'à ce que cela conduise à une réduction significative de ce type de questions sur les SO. :)
Sven Marnach
1
@MichaelGraczyk: Je suppose que vous parlez ici de tableaux NumPy. Plutôt que d'utiliser A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], je préférerais presque toujours numpy.rollaxis(A, axis, 0)[k]. En général, je suis rarement tombé sur un cas d'utilisation où vous auriez besoin de créer directement des slice()objets. Si vous en avez besoin de toute façon, NumPy fournit l' s_assistant comme moyen alternatif de les créer.
Sven Marnach
27
Il peut également être utile de savoir qu'une tranche de liste en général fait une copie d'une partie de la liste. Par exemple population[2:4], retournera une liste contenant la population [2] et la population [3] (le découpage est exclusif à droite). Laissant de côté les index gauche et droit, comme dans population[:]leur valeur par défaut à 0 et longueur (population) respectivement, sélectionnant ainsi la liste entière. C'est donc un idiome courant pour faire une copie d'une liste.
eh bien ... cela dépend vraiment du contexte. En fin de compte, il passe un sliceobjet ( slice(None,None,None)) à l' une des méthodes suivantes: __getitem__, __setitem__ou __delitem__. (En fait, si l'objet a un __getslice__, qui sera utilisé à la place de __getitem__, mais qui est maintenant obsolète et ne devrait pas être utilisé).
Les objets peuvent faire ce qu'ils veulent avec la tranche.
Dans le contexte de:
x = obj[:]
Cela appellera obj.__getitem__avec l'objet slice passé. En fait, c'est complètement équivalent à:
x = obj[slice(None,None,None)]
(bien que le premier soit probablement plus efficace car il n'a pas besoin de rechercher le sliceconstructeur - tout est fait en bytecode).
Pour la plupart des objets, c'est un moyen de créer une copie superficielle d'une partie de la séquence.
Prochain:
x[:]= obj
Est un moyen de définir les éléments (qu'il appelle __setitem__) en fonction de obj.
et, je pense que vous pouvez probablement deviner quoi:
del x[:]
appels ;-).
Vous pouvez également passer différentes tranches:
[:]
utilisé pour limiter ou trancher dans un tableau, hacher
par exemple:
[1: 5] pour afficher des valeurs entre 1 inclus et 5 exclusifs ie 1-4
[début: fin]
essentiellement utilisé dans un tableau pour trancher, comprendre les parenthèses acceptent la variable qui signifie valeur ou clé à afficher, et ":" est utilisé pour limiter ou découper l'ensemble du tableau en paquets.
Aucune raison de repousser une question aussi ancienne qui a déjà 5 réponses similaires et même une acceptée ... En outre, a[1:5]renvoie les éléments 1-4, pas 2-4.
Skamah One
@SkamahOne Oh je ne sais pas. Peut-être pas dans ce cas, mais il y a des moments où il peut être utile de soulever des questions mortes. Une vision différente, une formulation différente, etc. Dans ce cas, vous avez corrigé la réponse et, espérons-le, ils ont aussi appris quelque chose.
Réponses:
C'est un exemple de notation de tranche, et ce qu'elle fait dépend du type de
population
. Sipopulation
est une liste, cette ligne créera une copie superficielle de la liste. Pour un objet de typetuple
ou astr
, il ne fera rien (la ligne fera de même sans[:]
), et pour un tableau (disons) NumPy, il créera une nouvelle vue sur les mêmes données.la source
l.copy()
- être plus lisible, mais ça ne fonctionnera pas.list(l)
fonctionne toujours, est plus lisible et est garanti de renvoyer une copie même avec quelque chose commenumpy.array
list.clear()
. Cela prendra du temps, cependant, jusqu'à ce que cela conduise à une réduction significative de ce type de questions sur les SO. :)A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]
, je préférerais presque toujoursnumpy.rollaxis(A, axis, 0)[k]
. En général, je suis rarement tombé sur un cas d'utilisation où vous auriez besoin de créer directement desslice()
objets. Si vous en avez besoin de toute façon, NumPy fournit l's_
assistant comme moyen alternatif de les créer.Il peut également être utile de savoir qu'une tranche de liste en général fait une copie d'une partie de la liste. Par exemple
population[2:4]
, retournera une liste contenant la population [2] et la population [3] (le découpage est exclusif à droite). Laissant de côté les index gauche et droit, comme danspopulation[:]
leur valeur par défaut à 0 et longueur (population) respectivement, sélectionnant ainsi la liste entière. C'est donc un idiome courant pour faire une copie d'une liste.la source
eh bien ... cela dépend vraiment du contexte. En fin de compte, il passe un
slice
objet (slice(None,None,None)
) à l' une des méthodes suivantes:__getitem__
,__setitem__
ou__delitem__
. (En fait, si l'objet a un__getslice__
, qui sera utilisé à la place de__getitem__
, mais qui est maintenant obsolète et ne devrait pas être utilisé).Les objets peuvent faire ce qu'ils veulent avec la tranche.
Dans le contexte de:
Cela appellera
obj.__getitem__
avec l'objet slice passé. En fait, c'est complètement équivalent à:(bien que le premier soit probablement plus efficace car il n'a pas besoin de rechercher le
slice
constructeur - tout est fait en bytecode).Pour la plupart des objets, c'est un moyen de créer une copie superficielle d'une partie de la séquence.
Prochain:
Est un moyen de définir les éléments (qu'il appelle
__setitem__
) en fonction deobj
.et, je pense que vous pouvez probablement deviner quoi:
appels ;-).
Vous pouvez également passer différentes tranches:
constructions
slice(1,4,None)
constructions
slice(None,None,-1)
et ainsi de suite. Lectures complémentaires: expliquer la notation de tranche de Pythonla source
Il s'agit d'une tranche du début de la séquence à la fin, produisant généralement une copie superficielle.
(Eh bien, c'est plus que cela , mais vous n'avez pas encore besoin de vous en soucier.)
la source
Il crée une copie de la liste, au lieu d'attribuer simplement un nouveau nom à la liste déjà existante.
la source
[:]
utilisé pour limiter ou trancher dans un tableau, hacher
par exemple:
[1: 5] pour afficher des valeurs entre 1 inclus et 5 exclusifs ie 1-4
[début: fin]
essentiellement utilisé dans un tableau pour trancher, comprendre les parenthèses acceptent la variable qui signifie valeur ou clé à afficher, et ":" est utilisé pour limiter ou découper l'ensemble du tableau en paquets.
la source
a[1:5]
renvoie les éléments 1-4, pas 2-4.