2014-10-31 88 views
0

將對象添加到列表時出現問題。當我將對象追加到列表的末尾,然後嘗試遍歷它時,列表中的每個地方都會讓我回到最近添加的對象。Python將唯一類對象添加到列表中

該腳本比較來自Excel電子表格中不同項目的信息。我使用Python for Windows和win32com.client來訪問我感興趣的speadsheet。我在Stack Overflow上讀到了一些其他人遇到的問題,這些問題在列表中添加了獨特的對象,但我很確定我沒有具有與他們所做的相同的錯誤(在循環中初始化列表,而不是在創建類對象時提供輸入屬性)。

我可以註釋掉循環中的對象創建,並簡單地將數字添加到列表中,並且能夠打印出所有三個唯一值,但只要我將對象創建回調放入,就會出錯。下面的代碼只打印三個最近添加的項目。任何幫助將不勝感激,謝謝!

class Project: 
    """ 
    Creates an instance for each project 
    in the spreadsheet 
    """ 

    def __init__(self, bldg, zone, p_num, p_name, p_mgr, 
       const_mgr, ehs_lias, ehs_const, status, 
       p_type, start, finish): 
     self.bldg = bldg 
     self.zone = zone 
     self.p_num = p_num 
     self.p_name = p_name 
     self.p_mgr = p_mgr 
     self.const_mgr = const_mgr 
     self.ehs_lias = ehs_lias 
     self.ehs_const = ehs_const 
     self.status = status 
     self.p_type = p_type 
     self.start = start 
     self.finish = finish 

    def quickPrint(self): 
      """ prints quick glance projects details """ 
      if p_name is None: 
       pass 
      else: 
       print 'Building ' + str(bldg.Value) 
       print str(p_name.Value) 
       print str(p_type.Value) + " -- " + str(p_mgr.Value) 
       print str(start.Value) + " - " + str(finish.Value) 


projects = [] 
for i in range(25, 28): 
    bldg = excel.Cells(i,1) 
    zone = excel.Cells(i,2) 
    p_num = excel.Cells(i,3) 
    p_name = excel.Cells(i,4) 
    p_mgr = excel.Cells(i,5) 
    const_mgr = excel.Cells(i,6) 
    ehs_lias = excel.Cells(i,7) 
    ehs_const = excel.Cells(i,8) 
    status = excel.Cells(i,9) 
    p_type = excel.Cells(i,10) 
    start = excel.Cells(i,11) 
    finish = excel.Cells(i,12) 
    projects.append(Project(bldg, zone, p_num, p_name, p_mgr, 
         const_mgr, ehs_lias, ehs_const, 
         status, p_type, start, finish)) 
projects[0].quickPrint() 
projects[1].quickPrint() 
projects[2].quickPrint() 
+0

什麼是'quickPrint'? – 2014-10-31 15:27:06

+0

Project類中的一個函數,用於只打印項目開始/結束日期和名稱。我把它放在了上面,因爲它似乎在工作,只是印出了很多相同的東西! – jcusick 2014-10-31 15:30:49

+0

那麼,這是我的觀點:你怎麼知道這個問題不在印刷中,而不是對象的創造? – 2014-10-31 15:32:28

回答

0

我認爲您錯誤地定義了quickPrint。就其而言,p_name,p_type,p_mgr等沒有定義,所以它看起來更進一步的範圍解析樹,或任何它被稱爲,然後最終找到它們 - 你最後在for循環中定義它們,這就是爲什麼它給你最後的價值。

因爲你在循環中使用了相同的變量名,所以你隱藏了這個問題,並且使它更加混亂。

def quickPrint(self): 
     """ prints quick glance projects details """ 
     if self.p_name is None: 
      pass 
     else: 
      print 'Building ' + str(self.bldg.Value) 
      print str(self.p_name.Value) 
      print str(self.p_type.Value) + " -- " + str(self.p_mgr.Value) 
      print str(self.start.Value) + " - " + str(self.finish.Value) 

例如:

class Project(object): 
    def __init__(self, argument): 
    self.argument = argument 

    def __repr__(self): 
    return str(argument) 

projects = [] 
for i in range(10): 
    argument = i 
    projects.append(Project(argument)) 

print projects 

此輸出[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

改變__repr__(self):定義爲具有self.argument修復它。

+1

看起來他/她正在添加對同一對象的引用。你確定這是問題嗎? – khelwood 2014-10-31 15:32:53

+0

@khelwood - 你說得對。我已經更新它是我認爲是問題的原因。 – will 2014-10-31 15:46:14

+0

我使用了第二個建議,並在打印時發生錯誤。我可以通過單獨調用它們來查找單個對象及其屬性,因此它們至少可以正確插入到列表中。 現在看起來@DanielRoseman是對的,問題出在我的quickPrint()函數中。 謝謝! – jcusick 2014-10-31 15:50:00