用于循环遍历嵌套列表

时间:2013-06-01 02:04:08

标签: python nested-lists

我注意到一些非常奇怪的东西。我试着看看它出错的地方,并意识到由于某种原因,nest[0]列表在循环的中途不断变化。

>>> 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']

有人可以解释为什么会这样吗?我可能会做一些非常愚蠢的事情。

3 个答案:

答案 0 :(得分:2)

编辑:根据要求解释指针

您的问题是,当您将列表分配给嵌套[0]时,您不是在创建新列表,只需指定一个指针即可。您的指针指向包含['prefix']

的列表

在第一次迭代中,您向此列表中添加了一些内容

在你的第二次迭代中,你没有制作一个新的清单,你只是重新指向旧的清单。

然后,当您再次追加时,您将附加到旧列表中!

你的意思是:

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

有几种方法可以考虑这一点。这是一个。假设你有一副纸牌对象:

myobj = Deck(). 

如果我说,

myobj2 = myobj, 

我还没有创建一副新牌,就像其他人在看我已经拥有的牌组一样。我们需要能够做到这一点来做很多编程(这是面向对象设计的基础)!我需要说

myobj3 = Deck() 

构建一个新的牌组对象。

考虑:

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

myobj和myobj2都会改变。 调用myobj3.shuffle使另外两个保持不变。你所做的就告诉别人重新看一下同一套牌,你打算换一张新牌!

答案 1 :(得分:0)

list = nest[0]表示您将指向nest [0]的指针分配给变量名list

如果您需要预期的输出,则需要创建一个新列表以确保它不会影响原始输出。

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

nest[0] + part将创建一个新值并分配给list

答案 2 :(得分:0)

这只是用简单的词语澄清:

错误的

'list += part'

in

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

变量列表将在每次迭代中更改其值。 我的意思是变量列表将分配给以下值:

list = ['prefix'] 然后在第一次迭代后,它将重新分配为:

list = ['prefix','line 1'] ##注意循环执行列表+ = part,如果你继续它会得到[nest]的所有成员

所以解决方案的重点是在每次迭代中保持其值恒定的单独变量

'list = [] + nest[0]'