10 votes

En quoi `var[ :] = []` est-il différent de `var = []` ?

Je comprends normalement comment les tranches se comportent à gauche et à droite de l'opérateur d'affectation.

Cependant, j'ai vu ceci dans le manuel de Python (3.8.0) et j'essaie de comprendre ce qui me manque.

effacer la liste en remplaçant tous les éléments par une liste vide

lettres[ :] = []

En quoi est-ce différent de letters = [] ?

(Il n'est pas facile de rechercher [:] car stackoverflow pense que vous cherchez une balise. Donc, s'il y a déjà une réponse, je n'ai pas pu la localiser).

Je vois des réponses assez peu pertinentes. Donc, pour que les choses soient claires, la question n'est pas de savoir ce que la [:] signifie, plutôt que d'attribuer la vide à un.

8voto

quamrana Points 6411

Ce code démontre ce qui se passe :

original = ['a','b','c']

letters = original

print('Same List')
print(original)
print(letters)

letters = []

print('Different lists')
print(original)
print(letters)

letters = original

letters[:] = []

print('Same list, but empty')
print(original)
print(letters)

Sortie :

Same List
['a', 'b', 'c']
['a', 'b', 'c']
Different lists
['a', 'b', 'c']
[]
Same list, but empty
[]
[]

La première partie du code : letters = original signifie que les deux variables font référence à la même liste.

La deuxième partie : letters = [] montre que les deux variables font maintenant référence à des listes différentes.

La troisième partie : letters = original; letters[:] = [] commence avec les deux variables se référant à la même liste, mais ensuite la liste elle-même est modifiée (en utilisant la fonction [:] ) et les deux variables font toujours référence à la même liste, mais maintenant modifiée.

8voto

bereal Points 7280

La mission var = [] se lie à le nom var à la liste nouvellement créée. Le nom var peut ou non avoir été précédemment liée à une autre liste, et si c'est le cas, cette liste restera inchangée.

D'un autre côté, var[:] = [] s'attend à ce que var pour être déjà lié à une liste, et cette liste est modifiée sur place.

C'est pourquoi le comportement dans ces deux cas est différent :

var1 = [1, 2, 3]
var2 = var1
var1 = []
print(var1, var2)  # prints [] [1, 2, 3]

var1 = [1, 2, 3]
var2 = var1
var1[:] = []
print(var1, var2)  # prints [] []

5voto

chepner Points 54078

var = [] est une affectation au nom var . Il remplace quoi, si quoi que ce soit, var utilisé pour se référer à avec [] .

var[:] = [] est un appel de méthode déguisé : var.__setitem__(slice(), []) . Il remplace les éléments auxquels la tranche fait référence (dans ce cas, tous les éléments) par les éléments de la section [] ce qui vide effectivement la liste sans la remplacer complètement.

Par ailleurs, vous pouvez utiliser var.clear() pour accomplir la même chose ; l'affectation de tranches vous permet plus généralement de remplacer une plage de valeurs par une autre plage de valeurs, éventuellement plus longue ou plus courte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X