lista anidada de Python

Hoy encontré un problema al crear una lista anidada y decidí ver quién estaba detrás de ella.

>>> board1 = [[0]*3 for _ in range(3)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board2 = [[0]*3]*3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Sí, parece que ambos métodos pueden crear listas anidadas, pero hay un problema al asignar valores

>>> board1[1][1] = 1
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>> board2[1][1] = 1
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

Verifique la información y descubra que esta es la razón por la cual las 3 referencias en la lista board2 se refieren al mismo objeto. Como novato, aún perplejo, volví a ver el siguiente ejemplo

>>> board3 = []
>>> for i in range(3):
... 	row=[0] * 3 
... 	board3.append(row)
...
>>> board3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board3[1][1] = 1
>>> board3
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]

board3 y board1 son iguales, cada iteración crea una nueva lista, lo que significa que cada línea de la lista apunta a una dirección diferente.

Mira el ejemplo a continuación

>>> board4 = []
>>> row=[0] * 3
>>> for i in range(3):
...		board4.append(row)
>>> board4
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board4[1][1] = 1
>>> board4
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

board4 y board2 son iguales, cada iteración agrega el mismo objeto a la lista, lo que significa que cada fila de la lista apunta a la misma dirección de bloque.

¿Por qué está pasando esto?

Este es el principio y la trampa detrás de las referencias y los objetos mutables.

El valor predeterminado es hacer copia pitón superficial, si list1una lista list(list1) o list1[:]crea list1una copia, que hacen una copia superficial (copiar sólo la capa más externa del recipiente, una copia de los elementos todavía se refieren al elemento de fuente en el recipiente). Copia superficial que comparte el mismo objeto de lista

Para comprender claramente cómo funcionan, visualizaremos el proceso de creación de listas anidadas a continuación

board1 = [[0]*3 for _ in range(3)]
board1[1][1] = 1
board2 = [[0]*3]*3
board2[1][1] = 1

La primera línea:

Primero cree un objeto iterable, cree en el cuerpo del bucle y [0]*3asigne el valor a la posición correspondiente de la nueva lista

Se puede ver, cada sub-lista ocupa un espacio independiente dentro de la lista anidada, por lo que la asignación board1[1][1] = 1sólo cambiará uno

La tercera línea:

Las tres sublistas en la lista anidada apuntan al mismo objeto, por lo que la operación de asignación causará la situación que vimos inicialmente.

Puede intentar ingresar su propio código aquí para ver el proceso de ejecución visual. Mensaje de bienvenida

Supongo que te gusta

Origin www.cnblogs.com/gongyanzh/p/12743501.html
Recomendado
Clasificación