0

我注意到一些非常奇怪的事情。我试图看看哪里出了问题,并意识到由于某种原因,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']

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

4

3 回答 3

2

编辑:根据要求解释指针

您的问题是,当您将 list 分配给 nest[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 使其他两个保持不变。你所做的让别人重新审视同一个牌组,你打算在那里制作一个新牌组!

于 2013-06-01T02:12:25.733 回答
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

于 2013-06-01T02:21:24.537 回答
0

这只是简单的说明:

错的

'list += part'

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

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

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

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

所以解决方案专注于 gitting 单独的变量,在每次迭代中保持其值不变

'list = [] + nest[0]'
于 2013-06-01T02:45:33.520 回答