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?
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?
Réponses:
C'est un exemple de notation de tranche, et ce qu'elle fait dépend du type de population
. Si population
est une liste, cette ligne créera une copie superficielle de la liste. Pour un objet de type tuple
ou 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.
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 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.
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 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:
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 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:
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
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.)
Il crée une copie de la liste, au lieu d'attribuer simplement un nouveau nom à la liste déjà existante.
[:]
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.
a[1:5]
renvoie les éléments 1-4, pas 2-4.