.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.