
Objeto itertools.combinations() modifica mis variables de entrada y salida, aún despues de ejecutars
Publicado por Osvaldo (3 intervenciones) el 25/05/2018 08:35:18
Hola!
Estoy trabajando con un código que genera combinaciones sin repetición. Para esto uso el método res=itertools.combinations(Ent1,Ent2). Este modo me genera un objeto con todas las combinaciones. El problema es que, cuando yo opero con los elementos de res, se modifican todas las variables que estén involucradas en la función, lo cual, según yo, no debería pasar.
Para explicarme correctamente pongo el código:
Ahora, si dentro del ciclo, yo comento todo excepto el print(e) (todo lo que tiene #*), el código funciona de maravilla, y me devuelve lo que debería de volver (los valores de "e" correctos).
Ahora, lo que me interesa es operar con los elementos de "e". Para esto, creo un duplicado, "ee=e". Lo que yo quiero es modificar los elementos de "ee", sin tocar los de "e". Según yo, eso no debería ser ningún problema.
Pero resulta que, cuando yo modifico "ee", automáticamente se modifica también "e", lo que me descompone todo el ciclo, y las combinaciones ya no son las que deberían ser. Más extraño aún, cuando yo modifico a "ee", también se modifica la variable de entrada opc.
Según yo, esto no tiene senido, modificar "ee", no debería alterar a "e" y menos "opc". ¿Es normal que esto pase? ¿Es debido a la construcción de itertools, o se trata de algún bug? ¿o es algún error tonto que estoy cometiendo?
PD. Trabajo en Ubuntu, en anaconda 3-5.1.0 que interpreta con python 3.6
PD2: Ya encontré el problema, "e" es una tupla, y debería ser inmutable. El detalle es que es una tupla rellena de listas. Python sí me permite modificar las listas dentro de una tupla pero, al parecer, si esa tupla es la "copia" de otra, todas las tuplas se modifican.
Ahora, ¿eso cuenta como bug, no?
Finalmente, tenganme paciencia, es mi primera vez en el foro, así que hago ésta aclaración en lo que encuentro como borrar el hilo...
Estoy trabajando con un código que genera combinaciones sin repetición. Para esto uso el método res=itertools.combinations(Ent1,Ent2). Este modo me genera un objeto con todas las combinaciones. El problema es que, cuando yo opero con los elementos de res, se modifican todas las variables que estén involucradas en la función, lo cual, según yo, no debería pasar.
Para explicarme correctamente pongo el código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import itertools
N = 3; numE = 3
opc = [[0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1]]
res = itertools.combinations(opc, numE)
for e in res:
print (e)
ee = e #*
print (ee)#*
print (' iterando ')#*
for i in range(len(ee)):#*
ee[i][0] = ee[i][0] * 2#*
ee[i][1] = ee[i][1] * 3#*
print (e)#*
print (ee,'\n\n')#*
print ('Salí del ciclo')
print ('Opc= ',opc)
Ahora, si dentro del ciclo, yo comento todo excepto el print(e) (todo lo que tiene #*), el código funciona de maravilla, y me devuelve lo que debería de volver (los valores de "e" correctos).
Ahora, lo que me interesa es operar con los elementos de "e". Para esto, creo un duplicado, "ee=e". Lo que yo quiero es modificar los elementos de "ee", sin tocar los de "e". Según yo, eso no debería ser ningún problema.
Pero resulta que, cuando yo modifico "ee", automáticamente se modifica también "e", lo que me descompone todo el ciclo, y las combinaciones ya no son las que deberían ser. Más extraño aún, cuando yo modifico a "ee", también se modifica la variable de entrada opc.
Según yo, esto no tiene senido, modificar "ee", no debería alterar a "e" y menos "opc". ¿Es normal que esto pase? ¿Es debido a la construcción de itertools, o se trata de algún bug? ¿o es algún error tonto que estoy cometiendo?
PD. Trabajo en Ubuntu, en anaconda 3-5.1.0 que interpreta con python 3.6
PD2: Ya encontré el problema, "e" es una tupla, y debería ser inmutable. El detalle es que es una tupla rellena de listas. Python sí me permite modificar las listas dentro de una tupla pero, al parecer, si esa tupla es la "copia" de otra, todas las tuplas se modifican.
Ahora, ¿eso cuenta como bug, no?
Finalmente, tenganme paciencia, es mi primera vez en el foro, así que hago ésta aclaración en lo que encuentro como borrar el hilo...
Valora esta pregunta


0