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] = 4
que 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
a
y lo asigna ab
.2) asignación de cortes:
Esto reemplaza la porción de
a
con 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
a
en el lado izquierdo del=
operador, está usando la asignación normal de Python , que cambia el nombrea
en el contexto actual para apuntar al nuevo valor. Esto no cambia el valor anterior al quea
apuntaba.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,
a
es la misma lista exacta. Python simplemente proporciona un agradable azúcar sintáctico para modificar una lista en el lugar.fuente
a[:] = some_list
equivalente aa = some_list[:]
oa = some_list
?a[:] = some_list
establece todos los elementos dea
como los desome_list
. Hacer cualquiera de los que mencionas cambiaría lo quea
es. Por ejemplo:a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. La última línea sería False si cambiaraa
el 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] = x
es 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