2012-04-02 59 views
2

我一直在为udacity工作的代码如下所示。我试图弄清楚为什么当通过调用list(p)创建'g'时,列表'g'和'p'充当了同样的列表。当在移动功能中调用print语句(print [i] [j])时,它显示'g'改变时'p'被覆盖。我刚开始用python编程,我会很感激任何帮助。提前致谢。两个单独的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 
+0

为什么你认为你需要做所有这些复制?编写良好的Python代码通常会避免故意复制。不要复制,然后改变它,编写直接创建更改版本的代码。 – 2012-04-02 01:22:13

+0

P.S.通过'p_move'乘以所有东西的效果被标准化步骤取消,如果您刚开始使用标准化数据,则这是不必要的。另外,由于'p'在每个地方都以相同的“1./total”值开始,所以在“旋转”数组后不会看到差异。 – 2012-04-02 01:33:28

+0

我的代码无法按预期工作,这更令人感到沮丧。我意识到我不需要像我这样做复制,但我到了哪里我无法弄清楚问题,我想知道为什么它是错的。至于p_move,这是描述移动错误所必需的。标准化步骤将在我通过绿色或红色传感器读数循环时改变阵列。该代码尚未完成,并没有旋转阵列的一点,但随着“运动”和“读数”的发生,分布将发生变化。我正在尝试实现线性化。 – Jimmy 2012-04-02 03:51:38

回答

7

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

一个窍门是使用id(p)id(g)来找出对于每个参考物体身份是什么。这种调试可能有助于隔离您的问题。你打电话给list()构造函数很多,可能比必要的要多得多。像这样创建不必要的数据结构拷贝将会为CPU带来更多的工作,并且会影响关键性能代码。

+0

非常感谢!我用id来找出实际的对象标识,但我没有意识到list()构造函数不是递归的,而且本质上我有两个单独的列表指向相同的列表集合。现在这是有道理的。 – Jimmy 2012-04-02 00:49:14

+0

@aaronasterling,谢谢你的建议。我已经接受它现在最好。 – Jimmy 2012-04-02 03:47:31

相关问题