genera automáticamente la lista de un comportamiento incorrecto

votos
2

He encontrado una buena forma de lista en bucle haciendo aquí . Y el código ejecuta tan pronto como lo necesitaba.

x=[alpha,betta, gamma]
y=[[] for _ in range(len(x))]
y[1]=3

Me dará [[], 3, []]como se esperaba. Pero cuando traté de lujo el código:

z=[10,20,30]
x=[alpha,betta]
y=[[] for _ in range(len(z))]
y=[y for _ in range(len(x))]
y[1][1]=4

Me dará la forma correcta, pero voy a tener [[[], 4, []], [[], 4, []]]

En lugar de [[[], [], []], [[], 4, []]]que he obviamente caído en la trampa mencionado en el enlace, pero no entiendo por qué y cómo evitar este problema

Publicado el 20/10/2018 a las 10:28
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3

Aquí es donde el código va mal:

y=[y for _ in range(len(x))]

Debido a que está creando esencialmente dos punteros a la misma lista (es decir, Y). En vez usted podría intentar algo como esto:

y=[y.copy() for _ in range(len(x))]

Que resuelve su problema, ya que permite crear nuevas listas.

Respondida el 20/10/2018 a las 10:34
fuente por usuario

votos
1

esta solución corrige el problema que estás demostrando pero lo que si usted hace esto en su lugar:

y=[[] for _ in range(len(z))]
y=[y.copy() for _ in range(len(x))]
y[1][1].append(12)

Aquí estoy usando una referencia de lista en lugar de sobrescribir, así que sale:

[[[], [12], []], [[], [12], []]]

Maldita sea. ¿Por qué esto? porque copycrea un poco profunda copia, es necesariodeepcopy

import copy
y=[copy.deepcopy(y) for _ in range(len(x))]
y[1][1].append(12)

huellas dactilares:

[[[], [], []], [[], [12], []]]

Ahora elegir la que se adapte mejor a sus necesidades.

Respondida el 20/10/2018 a las 10:47
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more