2013-06-01 193 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]'