2013-10-22 52 views
0

還是編程/腳本編程的新手,這個人一直在困擾着我。我有一個函數可以搜索名稱列表,將它與模板名稱列表進行比較,當它找到匹配項時,它會按正確的順序將它放入我的最終列表中。對於一些以後的函數能夠正常工作,我需要能夠將這些名稱的一部分作爲數組/列表附加。我遇到的問題是,每當我需要將列表添加到最終列表中時,只要我更改變量,最終列表就會隨之更新。我該如何解決?Python Lists追加可變變量

light = ['template of names in here in correct order'] 
listUser = ['names gathered from user input'] 

for userChan in listUser: 
     for channelName in light: 
     #check if channelName is a list or string 

     if isinstance(channelName, basestring): 
     #search for matches in userchan 
      print channelName, 'is a string' 
      if channelName in userChan.lower(): 
       matchFound = True 
       listLight.append(userChan) 
     else: 
      print channelName, 'is a list' 
      for piece in channelName: 
       print 'searching %s in %s' %(piece, userChan.lower()) 

       if piece in userChan.lower(): 
        print "found %s in %s" %(piece, userChan.lower()) 
        lightMultList.append(piece) 
        matchFound = True 
        if len(lightMultList) == 2: 
         listLight.append(lightMultList) 
         del lightMultList[:] 

所以我的問題是與lightMultList。它總是被限制爲2個元素,但它會改變。希望這不是太可怕..

+1

我可以' t安靜地告訴你想要做什麼,但是我的猜測是你在哪裏添加了一個你想要複製的列表而不是追加實際的列表。所以'listLight.append(lightMultList [:])' – Hoopdady

+0

是的。就是這樣。超級簡單。謝謝 – CG7Son

+1

@ CG7Son:在這種情況下有更好的解決方案。通過清除它('del lightMultList [:]')並重新填充它來停止重用'lightMultList'。 – abarnert

回答

1

問題是,你只有創建一個lightMultList。您多次清除它(使用del lightMultList[:])並重新填充它,並將相同的內容反覆附加到lightList

簡單的修復方法是每次創建一個新的lightMultList。您可以通過修改這一行做:

del lightMultList[:] 

...到:

lightMultList = [] 

這種問題往往是試圖直接移植C或C++代碼,或者只是用C思維++的結果。如果您期待lightList.append(lightMultList)調用「複製構造函數」,那就是根本問題:Python中沒有這樣的東西。賦值給變量,附加到列表等等,不會複製任何東西;它只是將另一個引用綁定到相同的值。另外,C++程序員可能會嘗試通過避免通過嘗試重複使用同一個對象來浪費地創建所有這些臨時對象來優化性能,但在Python中,創建新列表的成本與成本大致相同重複第一步listUser一步。如果它足夠慢就會擔心,你將不得不重新組織你的代碼或者將整個東西移動到C或者Cython中;這不會有幫助。 (也就是說,它在C++中很少有用的優化;要做到這一點是正確的,在極少數情況下,在包含向量的地方構建新的向量......