Python – Anexando la lista a la lista durante el bucle while – El resultado no es el esperado

Python / progtwigndo al novato aquí, tratando de averiguar qué está pasando con este bucle while. Primero el código:

var_list = [] split_string = "pink penguins,green shirts,blue jeans,fried tasty chicken,old-style boots" def create_variations(split_string): init_list = split_string.split(',') first_element = init_list[0] # change first element of list to prepare for while loop iterations popped = init_list.pop() added = init_list.insert(0, popped) while init_list[0] != first_element: popped = init_list.pop() added = init_list.insert(0, popped) print init_list # prints as expected, with popped element inserted to index[0] on each iteration var_list.append(init_list) # keeps appending the same 'init_list' as defined on line 5, not those altered in the loop! print var_list create_variations(split_string) 

Mi objective es crear todas las variaciones de la init_list , lo que significa que los índices se rotan para que cada índice sea el primero una vez. Estas variaciones luego se agregan a otra lista, que es la var_list en este código.

Sin embargo, no estoy obteniendo el resultado que estoy esperando del bucle while. En el bucle while, el fragmento de código print init_list imprime las variaciones que deseo; pero la siguiente línea de código var_list.append(init_list) no var_list.append(init_list) estas variaciones. En su lugar, el init_list como se creó en la línea 5 se agrega repetidamente a la var_list .

¿Que esta pasando aqui? ¿Y cómo puedo obtener las diferentes variaciones de la init_list creada en el bucle while para adjuntar a la var_list .

La salida que espero para var_list :

 [['fried tasty chicken', 'old-style boots', 'pink penguins', 'green shirts', 'blue jeans'], ['blue jeans', 'fried tasty chicken', 'old-style boots', 'pink penguins', 'green shirts'], ['green shirts', 'blue jeans', 'fried tasty chicken', 'old-style boots', 'pink penguins'], ['pink penguins', 'green shirts', 'blue jeans', 'fried tasty chicken', 'old-style boots']] 

Con esta linea

 var_list.append(init_list) 

está agregando una referencia a init_list cada vez. Pero necesitas crear una nueva lista. Utilizar esta

 var_list.append(init_list[:]) 

Explicación

Cuando está imprimiendo init_list , imprime el estado actual. Cuando lo agrega a var_list , no está agregando el estado actual. Usted está agregando una referencia. Entonces, cuando la lista real cambia, todas las referencias apuntan a los mismos datos.

Y puedes simplificar tu progtwig así.

 def create_variations(split_string): init_list = split_string.split(', ') for i in range(len(init_list)): var_list.append(init_list[:]) init_list.insert(0, init_list.pop()) print var_list 

Aquí un código que hace lo que creo que quieres de una manera más simple:

 variations = [] items = [1,2,3,4,5] for i in range(len(items)): v = items[i:] + items[:i] variations.append(v) print variations 

Salida:

 [[1, 2, 3, 4, 5], [2, 3, 4, 5, 1], [3, 4, 5, 1, 2], [4, 5, 1, 2, 3], [5, 1, 2, 3, 4]] 

O puedes usar este simple generador:

 (items[i:] + items[:i] for i in range(len(items)))