python python-3.x

python - ¿Cómo es `var



python-3.x (3)

Esta pregunta ya tiene una respuesta aquí:

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.