Dos listas separadas de python que actúan como una

He estado trabajando en el código que se muestra abajo para udacity. Estoy tratando de averiguar por qué las listas ‘g’ y ‘p’ actúan como la misma lista cuando se crea ‘g’ al llamar a la lista (p). Cuando se llama a la instrucción de impresión (imprimir [i] [j]) en la función de movimiento, se muestra que ‘p’ se sobrescribe cuando se cambia ‘g’. Acabo de comenzar a progtwigr en python y agradecería cualquier ayuda. Gracias por adelantado.

colors = [['red', 'green', 'green', 'red' , 'red'], ['red', 'red', 'green', 'red', 'red'], ['red', 'red', 'green', 'green', 'red'], ['red', 'red', 'red', 'red', 'red']] measurements = ['green', 'green', 'green' ,'green', 'green'] motions = [[0,0],[0,1],[1,0],[1,0],[0,1]] sensor_right = 0.7 p_move = 0.8 def show(p): for i in range(len(p)): print p[i] total = len(colors[0])*len(colors) for i in range(len(colors)): p.append([]) for j in range(len(colors[i])): p[i].append(1./total) print p def move(g,c,r): t = list(g) for i in range(len(g)): for j in range(len(g[i])): print p[i][j] t[i][j] = t[(ic)%len(g)][(jr)%len(g[i])] * p_move print p[i][j] s = sum_table(t) for i in range(len(g)): for j in range(len(list(g[i]))): t[i][j] /= s return t def sum_table(g): sum = 0 for i in range(len(g)): for j in range(len(g[i])): sum += g[i][j] print sum return sum move(list(p),0,1) print p 

No he seguido a través de su código en detalle, pero la fuente de su problema es probablemente el uso de estructuras de datos bidimensionales (listas de listas). En Python, el constructor list() es una copia superficial , que solo copia un nivel de la lista. Es posible que pueda evitar el problema que está viendo utilizando la función copy.deepcopy() cuando sea apropiado.

Un truco es usar id(p) e id(g) para averiguar cuál es la identidad real del objeto para cada referencia. Este tipo de depuración puede ayudar a aislar su problema. Está llamando mucho al constructor list() , probablemente mucho más de lo necesario. Crear copias innecesarias de estructuras de datos como esta hará mucho más trabajo para la CPU y puede afectar el código crítico de rendimiento.