2012-08-10 40 views
3

我在寫一個Python腳本,它讀取一個CSV文件並創建一個deques列表。如果我打印出在添加之前附加到列表中的內容,它看起來就像我想要的,但是當我打印列表本身時,我可以看到附加內容正在用最新的內容覆蓋列表中的所有元素。爲什麼追加用新元素覆蓋列表中的所有內容?

# Window is a list containing many instances    
def slideWindow(window, nextInstance, num_attributes): 
    attribute = nextInstance.pop(0) 
    window.popleft() 
    for i in range(num_attributes): 
     window.pop() 
    window.extendleft(reversed(nextInstance)) 
    window.appendleft(attribute) 
    return window 

def convertDataFormat(filename, window_size): 
    with open(filename, 'rU') as f: 
     reader = csv.reader(f) 

     window = deque() 
     alldata = deque() 

     i = 0 
     for row in reader: 
      if i < (window_size-1): 
       window.extendleft(reversed(row[1:])) 
       i+=1 
      else: 
       window.extendleft(reversed(row)) 
       break 

     alldata.append(window) 

     for row in reader: 
      window = slideWindow(window, row, NUM_ATTRIBUTES) 
      alldata.append(window) 
#    print alldata 

     f.close() 
     return alldata 
+2

備註:當您使用'with open(...)'時,您不需要關閉文件。事實上,這是上下文管理者的優勢之一。 – delnan 2012-08-10 02:20:07

回答

2

這真的很難跟蹤你真正想從這段代碼中得到什麼。我懷疑問題出在以下幾點:

alldata.append(window) 

for row in reader: 
    window = slideWindow(window, row, NUM_ATTRIBUTES) 
    alldata.append(window) 

請注意,在你的slideWindow功能,您修改輸入雙端隊列window),然後返回修改後的deque。因此,您將deque放入列表的第一個元素,然後修改該對象(在slideWindow之內)並將的另一個參考附加到列表中的同一個對象。

這是你打算做什麼?

簡單的修復方法是將window輸入複製到slideWindow並修改/返回副本。

+0

對不起,我的代碼太混亂了。我不知道Python通過引用傳遞了所有內容,因此我必須複製一個窗口然後將其添加到所有數據。謝謝你的幫助! – 2012-08-10 04:09:24