Que signifie?

95

J'analyse du code Python et je ne sais pas quoi

pop = population[:]

veux dire. Est-ce quelque chose comme des listes de tableaux en Java ou comme un tableau bidimensionnel?

Andriy
la source
1
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).
Macke
Bonne discussion SO de la tranche Python: stackoverflow.com/questions/509211/…
Scott C Wilson

Réponses:

109

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.

Sven Marnach
la source
14
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.

ThomasH
la source
15

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:

x[1:4]

constructions slice(1,4,None)

x[::-1]

constructions slice(None,None,-1)et ainsi de suite. Lectures complémentaires: expliquer la notation de tranche de Python

mgilson
la source
10

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.)

Ignacio Vazquez-Abrams
la source
6

Il crée une copie de la liste, au lieu d'attribuer simplement un nouveau nom à la liste déjà existante.

Jim Brissom
la source
5

[:]
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.

Vijay Balkrishna konduskar
la source
1
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.
Pryftan le