有人可以解释这个python代码中的错误吗?

时间:2013-01-19 06:39:35

标签: python python-3.x

以下是生成列表清单的非工作和工作代码。

示例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)

2 个答案:

答案 0 :(得分:4)

在第一个示例中,l1在整个时间内都是相同的列表对象。执行l2.append(l1)后,您将此l1对象的引用插入l2。当循环重新启动并删除l1中的所有内容时,您还会删除l2内列表中的所有内容,因为这是相同的列表。您要将同一个列表对象多次附加到l2,因此每次清除它都会清除l2中的每个列表。

在第二个示例中,每次都创建一个单独的列表对象。因此,每个列表对象都是独立的,清除它不会影响其他列表对象。

答案 1 :(得分:3)

#1代码的可视化 - http://goo.gl/6ICqo

l2l1引用相同的对象(列表)。删除列表中的所有元素后,更改将反映在l2l1中。

可视化#2代码 - http://goo.gl/fkoqh

此处,当代码执行l1 = []时,l1的引用会被重新分配。但是l2的元素一直指的是原始对象。