以下是生成列表清单的非工作和工作代码。
示例1无法正常工作,它会重复上下反复添加的最后一个列表。
示例2,我在创建新列表时替换了delete,但确实可以正常工作。
# Example 1, this does not work correctly
l1 = []
l2 = []
x = 0
for n in range(0,3):
del l1[:] # deleting all list elements
for i in range(0,3):
l1.append(x)
x+=1
l2.append(l1)
print(l2)
# Example 2, this works correctly
l2 = []
x = 0
for n in range(0,3):
l1 = [] # creating the list each loop through
for i in range(0,3):
l1.append(x)
x+=1
l2.append(l1)
print(l2)
答案 0 :(得分:4)
在第一个示例中,l1
在整个时间内都是相同的列表对象。执行l2.append(l1)
后,您将此l1
对象的引用插入l2
。当循环重新启动并删除l1
中的所有内容时,您还会删除l2
内列表中的所有内容,因为这是相同的列表。您要将同一个列表对象多次附加到l2
,因此每次清除它都会清除l2
中的每个列表。
在第二个示例中,每次都创建一个单独的列表对象。因此,每个列表对象都是独立的,清除它不会影响其他列表对象。
答案 1 :(得分:3)
#1代码的可视化 - http://goo.gl/6ICqo
l2
和l1
引用相同的对象(列表)。删除列表中的所有元素后,更改将反映在l2
和l1
中。
可视化#2代码 - http://goo.gl/fkoqh
此处,当代码执行l1 = []
时,l1
的引用会被重新分配。但是l2
的元素一直指的是原始对象。