El documento de Python dice que cortar una lista devuelve una nueva lista.
Ahora, si se devuelve una lista "nueva", tengo las siguientes preguntas relacionadas con "Asignación a sectores".
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Ahora la salida sería:
[4, 5, 3]
- ¿Cómo puede algo que está devolviendo algo aparecer en el lado izquierdo de la expresión?
- Sí, leí los documentos y dice que es posible, ahora que al cortar una lista se devuelve una lista "nueva", ¿por qué se modifica la lista original? No puedo entender la mecánica detrás de esto.

a[0] = 4que haría?=, por lo que en lugar de descartarlo como sintaxis no válida, Python lo convierte en algo más parecido a lo que podría esperar. Dado que Python no tiene referencias, no funcionaría que el resultado de un segmento cambie la lista original. Obtienes una copia. Si proporcionó más información sobre su aplicación, es posible que podamos ayudarlo mejor a hacer las cosas de la manera 'pitónica'. :)Respuestas:
Está confundiendo dos operaciones distintas que utilizan una sintaxis muy similar:
1) rebanado:
Esto hace una copia del segmento de
ay lo asigna ab.2) asignación de cortes:
Esto reemplaza la porción de
acon el contenido deb.Aunque la sintaxis es similar (¡me imagino por diseño!), Estas son dos operaciones diferentes.
fuente
start=1,stop=None. Esto evitará copias y utilizará la evaluación diferida (en su caso, el acceso diferido a la lista original).Cuando especifica
aen el lado izquierdo del=operador, está usando la asignación normal de Python , que cambia el nombreaen el contexto actual para apuntar al nuevo valor. Esto no cambia el valor anterior al queaapuntaba.Al especificar
a[0:2]en el lado izquierdo del=operador, le está diciendo a Python que desea usar la asignación de sectores . Slice Assignment es una sintaxis especial para listas, donde puede insertar, eliminar o reemplazar contenido de una lista:Inserción :
Supresión :
Reemplazo :
Nota:
Slice Assignment proporciona una función similar a Tuple Unpacking . Por ejemplo,
a[0:1] = [4, 5]es equivalente a:Con Tuple Unpacking, puede modificar listas no secuenciales:
Sin embargo, el desembalaje de tuplas se limita al reemplazo, ya que no puede insertar ni quitar elementos.
Antes y después de todas estas operaciones,
aes la misma lista exacta. Python simplemente proporciona un agradable azúcar sintáctico para modificar una lista en el lugar.fuente
a[:] = some_listequivalente aa = some_list[:]oa = some_list?a[:] = some_listestablece todos los elementos deacomo los desome_list. Hacer cualquiera de los que mencionas cambiaría lo queaes. Por ejemplo:a = [1, 2, 3]b = aa[:] = [4, 5, 6]a is b. La última línea sería False si cambiaraael valor, en lugar de mutarlo.Me encontré con la misma pregunta antes y está relacionada con la especificación del idioma. Según declaraciones de asignación ,
Si el lado izquierdo de la asignación es una suscripción, Python llamará
__setitem__a ese objeto.a[i] = xes equivalente aa.__setitem__(i, x).Si el lado izquierdo de la asignación es slice, Python también llamará
__setitem__, pero con diferentes argumentos:a[1:4]=[1,2,3]es equivalente aa.__setitem__(slice(1,4,None), [1,2,3])Es por eso que el segmento de lista en el lado izquierdo de '=' se comporta de manera diferente.
fuente
Al cortar en el lado izquierdo de una operación de asignación, está especificando a qué elementos asignar.
fuente