2010-11-02 10 views

Respuesta

61

Al leer, list es una referencia a la lista original, y list[:] poco profundas-copia la lista.

Al asignar, list (re) enlaza el nombre y list[:] slice-assigns, reemplazando lo que estaba previamente en la lista.

Además, no utilice list como nombre ya que sombrea la función incorporada.

18

La última es una referencia a una copia de la lista y no a la lista. Entonces es muy útil.

>>> li = [1,2,3] 
>>> li2 = li 
>>> li3 = li[:] 
>>> li2[0] = 0 
>>> li 
[0, 2, 3] 
>>> li3 
[1, 2, 3] 
2

Aplicar la primera list a una variable creará una referencia a la lista original. El segundo list[i] creará una copia poco profunda.

por ejemplo:

foo = [1,2,3] 
bar = foo 
foo[0] = 4 

bar y foo será ahora:

[4,2,3] 

pero:

foo = [1,2,3] 
bar = foo[:] 
foo[0] = 4 

resultado será:

bar == [1,2,3] 
foo == [4,2,3] 

: es cortar.

3

Sin embargo, si los elementos de la lista son listas, incluso list1 = list[:] tiene sus problemas. Considere:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> b = a[:] 
>>> b[0].remove(2) 
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
>>> a 
[[1, 3], [4, 5, 6], [7, 8, 9]] 

Esto sucede porque cada elemento de la lista que se copia a b es una lista en sí, y esta copia de las listas implica el mismo problema que ocurre con la normal list1 = list2. El camino más corto a cabo que he encontrado es copiar de manera explícita cada elemento de la lista de esta manera:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> b=[[j for j in i] for i in a] 
>>> b 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> b[0].remove(2) 
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
>>> a 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Por supuesto, por cada grado adicional de anidación en la lista anidada, el código copiado profundiza por un adicional en línea for loop.

+1

Esto tendrá graves problemas si tiene niveles diferentes o desconocidos de anidamiento en su lista externa ('i' puede no ser iterable) Si tiene listas anidadas, debe usar la [copia] (http: // docs.python.org/library/copy.html), use 'b = copy.deepcopy (a)' en lugar de bucles anidados. – RoundTower

+0

^¡Gracias por el consejo! –

1

li [:] crea una copia de la lista original. Pero no se refiere al mismo objeto de lista. Por lo tanto, no se arriesga a cambiar la lista original cambiando la copia creada por li [:].

por ejemplo:

>>> list1 = [1,2,3] 
>>> list2 = list1 
>>> list3 = list1[:] 
>>> list1[0] = 4 
>>> list2 
[4, 2, 3] 
>>> list3 
[1, 2, 3] 

Aquí list2 se cambia cambiando list1 pero list3 no cambia.

Cuestiones relacionadas