2012-07-12 50 views
1

可能重複:
Modifying list while iteratingPython列表:如何在函數使用時添加對象?

我寫在那裏我試圖追加對象在一個類的主體創建的列表,從方法內部的Python腳本。

到目前爲止我的代碼是這樣的:

class Worker: 

    myList = ['one item', 'second item'] 

    def itter_List_Func(self, list_param): 
     for item in list_param: 
      more_items = item.split() 
      self.myList[:] = [self.myList + item for item in more_items] 

但一個奇怪的一種時尚我碰到一些「而itterated錯誤不能修改列表」。我是否應該離開就地更改並嘗試使用新項目創建新的List對象?或者由於list_param失去引用或其他原因會導致更多問題?

+0

嘗試def itter_List_Func(self,list_param): – 2012-07-12 10:11:06

+0

檢查:http://stackoverflow.com/questions/1637807/modifying-list-while-iterating&http://stackoverflow.com/questions/6777485/modifying-a -python-dict-while-iteling-it- – avasal 2012-07-12 10:11:38

+2

@ zubair89是的,它在那裏,抱歉的錯誤。 – NlightNFotis 2012-07-12 10:13:11

回答

1

要更明確一些「直接使一個新的列表」的想法,你想要的東西,如:

myList = sum((item.split() for item in myList), []) 

這就是簡單的編寫方式,不幸得慢,如果你有很多的項目(因爲sum依賴於加法,並且加法不是在Python中加入list的有效方法)。使用顯式循環:

result = [] 
for item in myList: 
    result.extend(item.split()) 
myList = result 

即:我們不創建列表的副本並嘗試修改它;我們創建一個空白列表並迭代地將其轉換爲我們想要的,並使用原始列表作爲該過程的輸入。

順便說一句,這裏有兩個可能的設計問題:您似乎期望函數每次調用時都會傳遞一個特定的值,並且您已定義了一個類屬性,您可能需要實例屬性。

1

好吧,從avasal爲我提供的鏈接,以及一些關於堆棧溢出的更多閱讀,我明白我所要做的是一個壞主意。也許我應該嘗試和複製一份原始列表的副本,或者對原始列表的副本進行分配,因爲如果我在列表中對列表進行更改時,不會通知這些參與者,從而導致奇怪的行爲或運行時錯誤。

+1

或者你可以採取更多功能的方法,並將'myList'分配給一個列表理解,它返回所需的元素。 – jamylak 2012-07-12 10:30:51

+0

@jamylak - 呃,你的評論讓我有點困惑。你能否以我更清楚的方式解釋你的評論? – NlightNFotis 2012-07-12 10:39:39

+1

+1不會創建一個副本,嘗試通過參考原始列表來修改它......這令人難以置信的混亂令人驚訝的快。取而代之的是,製作一個新的清單,代表您想要的東西,隨時隨地在迭代原始列表中進行「輸入」。更好的是,通過使用列表理解來自動執行該迭代,並根據原始結果簡單地描述結果,讓Python完成剩下的工作。退出試圖告訴Python如何組裝列表。它完全知道如何去做。 :) – 2012-07-12 10:41:07

相關問題