2013-06-01 256 views
0

我注意到一些非常奇怪的東西。我試圖看看它出錯的地方,並意識到由於某種原因,nest[0]列表在循環中途不斷變化。For循環通過嵌套列表

>>> nest = [['prefix'],['line 1'],['line 2']] 
>>> for part in nest[1:]: 
...  list = nest[0] 
...  list += part 
...  print list 

,我得到的輸出是:

['prefix', 'line 1'] 
['prefix', 'line 1', 'line 2'] 

然而,我需要的是:

['prefix', 'line 1'] 
['prefix', 'line 2'] 

有人可以解釋爲什麼出現這種情況?我可能會做一些非常愚蠢的事情。

回答

2

編輯:用指針的解釋,按要求

你的問題是,當你將列表窩[0],你是不是創建一個新的列表,你只需指定一個指針。您的指針指向含有[「前綴」]

關於你的第一次迭代的列表,你添加了一些這個名單

關於你的第二次迭代,你不把一個新的列表,你只需重新指向到舊的。

然後當您再次追加時,您將追加到舊列表!

你是什麼意思是:

nest = [['prefix'],['line 1'],['line 2']] 
for part in nest[1:]: 
    list = [] + nest[0] 
    list += part 
    print list 

有幾種方式來思考這個問題。這是一個。說你有一副牌對象:

​​

如果我然後說,

myobj2 = myobj, 

我還沒有創建的卡一副新牌,它會像別人看我的甲板已經有。我們需要能夠做到這一點,做很多編程(這是面向對象設計的基礎)!我需要說

myobj3 = Deck() 

建立一個新的甲板卡對象。

考慮:

myobj.shuffle #we're shuffling one deck, that two people are looking at 

兩個MyObj中和myobj2將發生變化。調用myobj3.shuffle會使另外兩個不變。你做過的事情告訴某人重新看看同一個套牌,你打算做一個新的套牌!

+0

謝謝。代碼工作。 我不明白的是爲什麼我的不工作。所以當我嘗試'list = ['prefix']'時,我可以看到它做到了我想要的。爲什麼指向同一個對象會改變它? – Rohit

+0

編輯後:感謝您的解釋。我仍然試圖圍繞如何解決我的問題。你是否說你的例子中'nest [0]'是'Deck()'對象? – Rohit

+0

你的「巢穴[0]」是一副撲克牌。調用list = nest [0]只是告訴我們看看甲板(裏面有'前綴'這個單詞),然後將這個查找存儲在標籤爲「list」的地方。我們從來沒有在這裏創建一副新的牌或新的名單。所以當你追加部分列表時,你正在向卡組添加一張新卡。在下一次迭代中,您再次調用list = nest [0],但這只是告訴您回頭看看現在有額外卡片的卡組。當我們添加另一張卡時,我們現在有兩個額外的。這有幫助嗎? –

0

list = nest[0]意味着你如果你希望你的預期輸出分配指針窩[0]變量名list

,你需要創建一個新的列表,以確保它不會影響原來的。

nest = [['prefix'],['line 1'],['line 2']] 
for part in nest[1:]: 
    list = nest[0] + part 
    print list 

nest[0] + part將創建一個新的價值,並分配給list

0

這只是澄清簡單的話:

'list += part' 

' for part in nest[1:]: 
list = nest[0] 
list += part 
print list' 

變量列表將在每次迭代改變它的值.. 我指的是varible列表將分配到以下值:

列表= [「前綴」] 然後在第一次迭代之後,將重新分配爲:

名單= [「前綴」,「1號線」] ##注環路EXCUTE列表+ =一部分,如果你繼續它會得到[窩]

因此該解決方案專注於gitting獨立變量的所有成員其在每次迭代中保持其值不變

'list = [] + nest[0]'