Two separate python lists acting as one

Refresh

December 2018

Views

200 time

2

I've been working on the code shown below for udacity. I'm trying to figure out why the lists 'g' and 'p' are acting as the same list when 'g' is created by calling list(p). When the print statement (print[i][j]) is called in the move function it shows that 'p' is being overwritten when 'g' is changed. I just started programming in python and I would appreciate any help. Thanks in advance.

    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[(i-c)%len(g)][(j-r)%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

1 answers

7

Я не следовал через код в деталях, но источник вашей проблемы, скорее всего , использование двух размерных структур данных (списки списков). В Python, то list()конструктор является неполной копией , которая копирует только один уровнем списка. Вы можете быть в состоянии избежать этой проблемы вы видите с помощью copy.deepcopy()функции , где это необходимо.

Один трюк заключается в использовании id(p)и id(g)выяснить , что фактический идентификатор объекта для каждой ссылки. Такого рода отладки может помочь изолировать проблему. Вы вызвав list()конструктор много, вероятно , гораздо больше , чем нужно. Создание ненужных копий структур данных , как это будет сделать гораздо больше работы процессора и может повлиять на производительность критического кода.