两个单独的python列表作为一个

时间:2012-04-02 00:32:50

标签: python list

我一直在研究下面显示的udacity代码。我试图找出为什么当通过调用list(p)创建'g'时,列表'g'和'p'作为相同的列表。当在移动函数中调用print语句(print [i] [j])时,它表示当'g'被改变时'p'被覆盖。我刚开始用python编程,我很感激任何帮助。提前谢谢。

    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 个答案:

答案 0 :(得分:7)

我没有详细介绍您的代码,但您的麻烦来源可能是使用二维数据结构(列表列表)。在Python中,list()构造函数是浅拷贝,它只复制一个级别的列表。您可以在适当的情况下使用copy.deepcopy()功能来避免您遇到的问题。

一个技巧是使用id(p)id(g)来找出每个引用的实际对象标识。这种调试可能有助于隔离您的问题。你正在调用list()构造函数,可能远远超过必要的。创建这样的数据结构的不必要的副本将为CPU做更多的工作,并且可能影响性能关键代码。