python list slice notation shallow-copy

.copy() python



¿Qué hace esta notación para las listas en Python: "someList[:]"? (5)

Cuando necesite modificar la lista y no desee cambiar la lista y crear otra lista que use

y = [1,2,3] x = y[:]

y puede hacer muchos cambios en la lista, pero la lista de origen estará en (y) y la modificación en (x)

A veces me someList[:] en esta forma de imprimir o devolver una lista - someList[:] . No veo por qué las personas lo usan, ya que devuelve la lista completa.

¿Por qué no simplemente escribir someList , sin la parte [:] ?


En python, cuando haces a = b , a no toma el valor de b, sino que hace referencia al mismo valor al que hace referencia b. Para ver esto, haz:

>>> a = {''Test'': 42} >>> b = a >>> b[''Test''] = 24

¿Cuál es ahora el valor de a?

>>> a[''Test''] 24

Es similar con las listas, por lo que debemos encontrar una manera de copiar realmente una lista, y no hacer una referencia a ella. Una forma podría ser recrear la lista copy = list(list1) , o usar las funciones del módulo de copy . Pero, después de todo, la forma más sencilla, la más bonita, la mejor () de hacer esto es copiar cada valor de la primera lista en el otro, haciendo copy = list1[:] . Utiliza las divisiones, ¡aquí list1 se corta del índice 0 al índice len (list1), por lo que se devuelve toda la lista1!

Además, el método de corte es ligeramente más rápido: utilizando el método time.clock () para medir el tiempo medio de ejecución de 1000 asignaciones de listas, cada una de las cuales contiene 10000 enteros aleatorios, con cortes, constructor y copia profunda, los resultados muestran que los cortes son 15% más rápido que el método constructor, y deepcopy es 4 veces más lento. Sin embargo, esta ganancia de tiempo es insignificante cuando se usan listas pequeñas: por lo tanto, el uso de copy = list(list_to_copy) o copy = list_to_copy[:] depende de las preferencias del desarrollador.

Finalmente, a menudo olvidamos el método list.copy, ¡que parece ser el más rápido! ¡De hecho, es incluso un 13% más rápido que el método de corte!


Hay 2 copias disponibles. 1) Copia profunda 2) Copia superficial.
1) Copia profunda es solo copiar los valores
list = [''abc'',123,''xyz'']
list1 = copy.deepcopy(list) or list1 = list[:]

2) Shallow Copy es solo referencia al varible
list2 = copy.copy(list) or list2 = list

Cuando modifica algo en list2, se efectúa en la lista también a medida que se referencia. list1.append(456)
list2.append(''789'')
print "list: %s" %list
print "list1: %s" %list1
print "list2: %s" %list2
ans:
list : [''abc'',123,''xyz'',''789'']
list1 : [''abc'',123,''xyz'',456]
list2 : [''abc'',123,''xyz'',''789'']


Para crear una copia de una lista en lugar de pasar por referencia, como lo hace Python. Use los siguientes dos ejemplos para entender la diferencia.

Ejemplo:

# Passing by reference SomeListA = [1, 2, 3] SomeListB = [2, 3, 4] SomeListB = SomeListA SomeListA[2] = 5 print SomeListB print SomeListA # Using slice SomeListA = [1, 2, 3] SomeListB = [2, 3, 4] SomeListB = SomeListA[:] SomeListA[2] = 5 print SomeListB print SomeListA


[:] crea una porción, generalmente utilizada para obtener solo una parte de una lista. Sin ningún índice mínimo / máximo dado, crea una copia de la lista completa. Aquí hay una sesión de Python que lo demuestra:

>>> a = [1,2,3] >>> b1 = a >>> b2 = a[:] >>> b1.append(50) >>> b2.append(51) >>> a [1, 2, 3, 50] >>> b1 [1, 2, 3, 50] >>> b2 [1, 2, 3, 51]

Observe cómo agregar a b1 también se agrega el valor a a . Sin embargo, agregar a b2 no modificó a , es decir, b2 es una copia.