Un problema con las listas enlazadas anidadas en Python. Las dos formas de escritura siguientes tienen resultados diferentes.
Déjame explicarte lo que entiendo. Esto depende de la asignación de memoria.
,?Estos tres ceros son diferentes direcciones de memoria asignadas, y
¿Entiendes los tres ceros dentro como:? Zhang San, Li Si, Wang Wu, son tres personas. Si cambias uno de ellos, no afectará a los otros dos. Pero
[[0]]*3? El resultado [[0], [0], [0]] puede entenderse como: Zhang San, Xiao Zhang, Ah San, donde Xiao Zhang y Ah. San son dos apodos para Zhang San. Estos tres [0] son en realidad 1 persona. Entonces, si cambias uno [0], los otros dos [0] definitivamente cambiarán.
Si escribes [[0], [0], [0] directamente, se puede entender que estos tres [0] son tres personas diferentes.
¿En cuanto a por qué [[0]]*3 obtiene [[0], [0], [0]]? Y definir directamente [[0], [0], [0]] tiene el mismo aspecto. Pero cuando modificas el valor de un elemento, obtienes resultados diferentes. Este es el mecanismo de implementación de Python. No te preocupes demasiado por esto, porque Python está diseñado de esta manera. Sólo necesitas entender la lógica y utilizarla cuando la necesites.
Escrito al final: Esto es sólo mi propio entendimiento. No hay base teórica, espero que no desvíe el tema.
Espero que pueda ser útil para quien pregunta. Las preguntas son bienvenidas.
Respuesta modificada:
Utilizando la sintaxis de "tresZeros=[0] * 3", después de ejecutar la declaración, en el estado inicial, solo se creará un objeto en el memoria, y luego Las direcciones de los tres elementos apuntarán al objeto, es decir, en este momento solo se creará un objeto en la memoria, y luego tres ceros [0], tres ceros [1] y tres ceros [ 2] todos apuntarán a esta dirección, es decir, ID(tres ceros[0]) = = ID(tres ceros[0]) = = ID(tres ceros[0])== ID(tres ceros
Cuando lo inicializamos por separado Cuando se asigna un elemento en tres ceros, se crea un nuevo espacio en la memoria para crear un nuevo objeto Entonces cuando terminamos de ejecutar,
tres ceros[0] = 3. <. /p>
Descubrirá que la dirección de id(tresZeros[0]) ha cambiado, pero id(tresZeros[1]) e id(tresZeros[2]) no han cambiado, porque solo cambió el elemento tresCeros[0]