2012-04-02 52 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

相關問題