python - ¿Cómo es `var
python-3.x (3)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cuál es la forma correcta de reasignar una lista en Python? 2 respuestas
- Comprender la notación de corte 32 respuestas
Normalmente entiendo cómo se comportan los sectores a la izquierda y a la derecha del operador de asignación.
Sin embargo, he visto esto en el manual de Python (3.8.0) y estoy tratando de descubrir lo que me falta.
borre la lista reemplazando todos los elementos con una lista vacía
letras [:] = []
¿Cómo es eso diferente de solo
letters = []
?
(No es fácil buscar
[:]
ya que stackoverflow cree que está buscando una etiqueta. Entonces, si ya hay una respuesta, no podría encontrarla).
Veo algunas respuestas bastante irrelevantes.
Entonces, para aclarar, la pregunta no es acerca de lo que significa el segmento
[:]
, sino más bien de asignar la lista
vacía
a una.
Este código demuestra lo que está sucediendo:
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)
Salida:
Same List
[''a'', ''b'', ''c'']
[''a'', ''b'', ''c'']
Different lists
[''a'', ''b'', ''c'']
[]
Same list, but empty
[]
[]
La primera parte del código:
letters = original
significa que ambas variables se refieren a la misma lista.
La segunda parte:
letters = []
muestra que las dos variables ahora se refieren a diferentes listas.
La tercera parte:
letters = original; letters[:] = []
letters = original; letters[:] = []
comienzan con ambas variables que hacen referencia a la misma lista nuevamente, pero luego la lista misma se modifica (usando
[:]
) y ambas variables todavía se refieren a la misma lista, pero ahora modificada.
La asignación
var = []
vincula
el nombre
var
a la lista recién creada.
El nombre
var
puede o no haberse vinculado previamente a cualquier otra lista, y si lo ha hecho, esa lista permanecerá sin cambios.
Por otro lado,
var[:] = []
espera que
var
ya esté vinculado a una lista, y esa lista se cambia en el lugar.
Es por eso que el comportamiento en estos dos casos es diferente:
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 [] []
var = []
es una asignación al nombre
var
.
Reemplaza a lo que, si acaso,
var
solía referirse con
[]
.
var[:] = []
es una llamada al método disfrazada:
var.__setitem__(slice(), [])
.
Reemplaza los elementos a los que hace referencia el segmento (en este caso, todos ellos) con los elementos en
[]
, vaciando efectivamente la lista sin reemplazarla por completo.
Por cierto, puede usar
var.clear()
para lograr lo mismo;
La asignación de sectores generalmente le permite reemplazar un rango de valores con otro rango de valores, posiblemente más largo o más corto.