2016-12-28 194 views
1

到目前为止,我的代码接受来自用户的输入,然后将所有这些输入附加到列表中。将一个列表添加到一个单独的列表中

list1.append(input1) 

list1.append(input2) 

etc 

然后我追加此列表成为一个新列表

list2.append(list1) 

所有这一切工作正常,但当我尝试清除列表1,因此用户可以为新的列表1的输入数据,列表也是从列表2

del list1 [:] 

打印列表2时,那么只显示最新列表1清除。有更好的数据结构可供使用吗?或者,如果代码的语法不同,这个工作是否会起作用?

理想的结构,我想这个名单已经是:

list2 = [[x, y, z],[a,b,c],[g,h,i]] 

(有我的实际代码更为项)

虽然目前它更像是:

list2 = [[], [], [g,h,i]] 

后来我希望能够识别和打印所有列表,如果他们的第二个项目是“Y”。所以在上面的例子中,将会返回[x,y,z]。这可能使用2D列表吗?

回答

1

这是因为名单通过引用传递,所以,当你调用list2.append(list1),你真的只是追加到list2list1参考。

所以,如果你修改list1可言,修改可以看出list2

>>> list1 = [1, 2] 
>>> list2 = [list1] 
>>> list1 
[1, 2] 
>>> list2 
[[1, 2]] 
>>> list1.append(3) 
>>> list1 
[1, 2, 3] 
>>> list2 
[[1, 2, 3]] # list1's changes can be seen here 

要解决这个问题,你可以的list1拷贝追加到list2

list2.append(list1[:])

或更优选,仅仅是“复位”的变量list1。取而代之的del list1[:],其中修改就地名单:

list1 = []

0
list2.append(list1) 

list2只是追加list1引用。你需要追加list1的副本。

import copy 
list2.append(copy.copy(list1)) 
2

你有两个选择......你可以把任何的list1一个副本list2

list2.append(list1.copy()) # `list1[:]` for older python versions 

或者,而不是清除list1,你可以做一个新的列表:

list2.append(list1) 
list1 = [] # Rather than `del list1[:]` 

这后一个版本将会更常见(和更好的表现),是我想要的解决方案推荐。

+0

“两个选项”部分是正确答案的唯一途径。 –

0

相反的list2.append(list1),你应该使用:现在

list2.append(list1[:]) # Or list1.copy() 

list1拷贝追加到list2,而不是list1本身。

输出:

随着list2.append(list1)

>>> list2 = [] 
>>> 
>>> list1 = [1, 2, 3] 
>>> list2.append(list1) 
>>> del list1[:] 
>>> 
>>> list1 = [1, 5, 5] 
>>> list2.append(list1) 
>>> 
>>> list2 
[[], [1, 5, 5]] 

随着list2.append(list1[:])

>>> list2 = [] 
>>> 
>>> list1 = [1, 2, 3] 
>>> list2.append(list1[:]) 
>>> del list1[:] 
>>> 
>>> list1 = [1, 5, 5] 
>>> list2.append(list1[:]) 
>>> 
>>> list2 
[[1, 2, 3], [1, 5, 5]] 
1

原因你获得这种行为是因为你的追加参考list1而不是副本。这是因为Python列表的工作方式。除非你明确地告诉python到拷贝列表的内容,否则将附加一个列表参考列表。这意味着,说del list1[:]当你还影响list2

这可以通过明确地告诉Python来复制你的列表中的内容要解决的参考list1,而不是简单地复制到同一列表的引用。

list2.append(list1.copy()) # or list[:] 

对于更复杂的结构,copy.deepcopy()应该使用:

>>> import copy 
... 
>>> list2.append(copy.deepcopy(list1)) 
相关问题