while for python list random while-loop

for - using random in python



Python random shuffle while loop (2)

Intento llenar listas con permutaciones de la misma lista inicial. No entiendo por qué lo siguiente no está funcionando.

parts = [[],[]] while len(parts[-1]) < 2: newval = random.choice([[1,2,3,4],[5,6,7,8]]) for part in parts: random.shuffle(newval) part.append(newval)

El resultado esperado sería algo así como: [[[6,7,8,5],[1,3,4,2]],[[5,8,6,7],[4,2,3,1]]]


Porque en Python todo es referencia. Cuando agrega el valor a la matriz, de hecho agrega la referencia al lugar en la memoria donde se almacena el valor.

Diga, ha asignado la lista al primer elemento. Cuando en la próxima iteración vuelva a mezclar esta lista, cambie el valor en la memoria. Por lo tanto, el valor que tendrá cuando acceda al elemento que agregó en el paso anterior también cambiará.

Para solucionarlo, intente copy.copy(newval) lugar de newval (no olvide import copy )

Aquí está su código cambiado en consecuencia:

import copy parts = [[],[]] while len(parts[-1]) < 2: newval = random.choice([[1,2,3,4],[5,6,7,8]]) for part in parts: random.shuffle(newval) part.append(copy.copy(newval))


random.shuffle funciona in situ y, en consecuencia, modifica newval . Tiene que hacer una copia al anexarla a la part contrario, la misma lista (o referencia de lista) se baraja y se almacena en part .

import random parts = [[],[]] while len(parts[-1]) < 2: newval = random.choice([[1,2,3,4],[5,6,7,8]]) for part in parts: random.shuffle(newval) part.append(newval[:]) print(parts)

posibles resultados:

[[[3, 1, 2, 4], [5, 7, 6, 8]], [[1, 2, 4, 3], [6, 7, 5, 8]]] [[[1, 3, 2, 4], [4, 2, 1, 3]], [[2, 4, 3, 1], [4, 3, 2, 1]]] [[[7, 5, 6, 8], [3, 2, 4, 1]], [[8, 5, 6, 7], [1, 4, 3, 2]]]