2016-11-13 1 views
0

Je viens de découvrir ci-dessous python 2.6 Code pythonliste python Clearing avec l'opérateur de la tranche copie

for i in elements[:]: 
    elements.remove(i) 

J'essaie de comprendre la raison d'utiliser cette syntaxe pour effacer la liste. Je comprends le concept de suppression inplace, mais pourquoi pas, par exemple:

del elements[:] 

ou

elements[:] = [] 

Thx!

+0

S'il n'y a pas de condition dans la boucle, il n'y a pas besoin d'utiliser une boucle. Peut-être que l'auteur n'est pas au courant des autres méthodes. –

+0

C'est un mauvais code. L'avez-vous vu ici? Peut-être que c'est juste une démo de copier une liste pour éviter les pièges de la suppression en itérant. – tdelaney

+0

Le code est tel qu'il est. Et c'est un "vrai" code. Mais merci, vous me réconfortez dans ce que je pensais. Mais quand il s'agit de comprendre le code de quelqu'un d'autre, j'ai toujours peur de manquer un point subtil ... –

Répondre

0

Vous devez considérer les listes Python comme des 'pointeurs'.

Par exemple, si vous déclarez une liste comme ceci:

elements = [1, 2, 3] 

Ce serait vu dans la mémoire comme ceci:

elements → [ ↓, ↓, ↓ ] 
      1 2 3 

Ainsi, lorsque vous modifiez un élément dans la liste que vous faites Quelque chose comme ceci:

elements[1] = 4 
       4 
elements → [ ↓, ↑, ↓ ] 
      1 2 3 

Notez comment le numéro 2 n'a pas de référence de pointeur de sorte qu'il sera 'allé o r perdu de mémoire »et ce n'est plus accessible. Ainsi, la même chose se produit lorsque vous réattribuer la variable elle-même:

elements[:] = [] 

     [] 
elements ↑  [ ↓, ↓, ↓ ] 
       1 4 3 

La clé de comprendre ici est que la liste originale est également « disparu ou de la mémoire perdue » et il est plus accessible. Une autre clé importante à comprendre est que le découpage en tranches:

elements[:] Vous obtenez le pointeur (ou la flèche dans mes illustrations) auquel la variable fait référence.

Voilà pourquoi il est exactement la même chose à utiliser

del elements[:] (effacer la flèche et définir une nouvelle flèche à une liste vide)

ou

elements[:] = [] (je fais la variable maintenant le point à une nouvelle liste vide, l'ancienne flèche sera supprimée quand elle sera déréférencée)

Espérons que cela aide!

+0

Merci pour votre réponse, je suis conscient de ce que vous expliquez ... Et, quelqu'un me corrige si je me trompe, mais "del elements [:] et elements [:] = []" ne fait pas réellement supprimer la liste, il la vide "inplace". c'est-à-dire que id (éléments) avant et après sont les mêmes ...Ma question portait sur la subtilité de la syntaxe «pour» que j'ai mentionnée. –