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

两个单独的python列表作为一个,python,list,Python,List,我一直在为udacity编写下面所示的代码。我试图弄清楚,当调用list(p)创建“g”时,为什么列表“g”和“p”充当相同的列表。在move函数中调用print语句(print[i][j])时,当“g”被更改时,表明“p”被覆盖。我刚开始用python编程,如果有任何帮助,我将不胜感激。提前谢谢 colors = [['red', 'green', 'green', 'red' , 'red'], ['red', 'red', 'green', 'red', 'red'],

我一直在为udacity编写下面所示的代码。我试图弄清楚,当调用list(p)创建“g”时,为什么列表“g”和“p”充当相同的列表。在move函数中调用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

我没有详细介绍您的代码,但您的问题可能是使用了二维数据结构(列表列表)。在Python中,
list()
构造函数是一个浅层副本,它只复制列表的一个级别。在适当的情况下,使用该函数可以避免您看到的问题


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

非常感谢!我使用id来找出实际的对象标识,但我没有意识到list()构造函数不是递归的,实际上我有两个单独的列表指向相同的列表集。现在说得通了。@aaronasterling,谢谢你的建议。我现在认为这是最好的。你为什么认为你需要做这些复制?编写良好的Python代码通常避免故意复制。编写代码直接创建更改后的版本,而不是制作副本然后对其进行更改。将所有内容乘以
p_move
的效果会被标准化步骤抵消,如果您刚开始使用标准化数据,则无需执行标准化步骤。另外,由于
p
在每个位置都以相同的
1./total
值开始,所以在“旋转”数组之后,您不会看到任何差异。更令人沮丧的是,我的代码没有按预期工作。我意识到我不需要像以前那样复制,但我到了一个无法解决问题的地步,我想知道为什么这是错误的。对于p_移动,这是描述移动误差的必要条件。当我循环读取绿色或红色的传感器读数时,标准化步骤将改变阵列。这段代码并没有接近完成,也没有旋转阵列的点,但随着“移动”和“读数”的发生,分布将发生变化。我正在尝试实现线性化。我明白你关于p_移动的观点,我的意思是也有一个组件,其中移动误差被考虑在内。谢谢你指出这一点。在我上面的代码中,乘以p_move实际上什么都不做。*本地化(不是线性化)