到目前为止,我的代码接收来自用户的输入,然后将所有输入附加到列表中。
list1.append(input1)
list1.append(input2)
etc
然后我将此列表附加到新列表
list2.append(list1)
所有这一切都运行正常但是当我尝试清除list1时,用户可以输入新list1的数据,列表也会从list2清除
del list1 [:]
因此,打印list2时只显示最新的list1。是否有更好的数据结构可供使用?或者如果代码的语法不同,这会有效吗?
我希望此列表具有的理想结构是:
list2 = [[x, y, z],[a,b,c],[g,h,i]]
(我的实际代码中有更多项目)
虽然目前更像是:
list2 = [[], [], [g,h,i]]
稍后我希望能够识别并打印所有列表,如果他们的第二项是" y"。所以在上面的例子中,将返回[x,y,z]。这可以使用2D列表吗?
答案 0 :(得分:2)
您有两种选择......您可以将list1
的副本放入list2
:
list2.append(list1.copy()) # `list1[:]` for older python versions
或者,您可以只创建一个新列表,而不是清除list1
:
list2.append(list1)
list1 = [] # Rather than `del list1[:]`
后一版本会更常见(并且性能更好),并且是我通常推荐的解决方案。
答案 1 :(得分:1)
这是因为列表通过引用传递,因此当您致电list2.append(list1)
时,您实际上只是将list1
的引用附加到list2
。
因此,如果您完全修改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 = []
。
答案 2 :(得分:1)
您获得此行为的原因是您将引用附加到list1
而不是副本。这是因为Python列表的工作方式。除非您明确告诉python 复制列表的内容,否则将附加列表的 refernece 。这意味着在说出del list1[:]
时,您也会影响list1
中对list2
的引用
这可以通过明确告诉Python复制列表内容而不是简单地将引用复制到同一列表来解决。
list2.append(list1.copy()) # or list[:]
对于更复杂的结构,应使用copy.deepcopy()
代替:
>>> import copy
...
>>> list2.append(copy.deepcopy(list1))
答案 3 :(得分:0)
list2.append(list1)
list2只是附加list1引用。您需要附加list1的副本。
import copy
list2.append(copy.copy(list1))
答案 4 :(得分: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]]