一维列表的浅表复制

时间:2018-08-06 18:50:08

标签: python-3.6

在阅读shallow copy时。它说copy.copy(x)创建浅拷贝。但是在单维列表的情况下,我看不到浅层复制行为。

示例:

>> new = [1,2,3,4,5,6]
>> original = copy.copy(new)
>> new
[1, 2, 3, 4, 5, 6]
>> original
[1, 2, 3, 4, 5, 6]
>> id(new)
65022912
>> id(original)
65022512
>> new[2]=13
>> new
[1, 2, 13, 4, 5, 6]
>> original
[1, 2, 3, 4, 5, 6]

所以在这里,我假设更新“新”列表应该更新“原始”列表,但是这没有发生。

对于多维列表,浅表副本正常工作。

示例:

>> parent_list = [1, 2, [3,4], [5,6]]
>> child_list = copy.copy(parent_list)
>> parent_list[2][1] = "Python"
>> parent_list
[1, 2, [3, 'Python'], [5, 6]]
>> child_list
[1, 2, [3, 'Python'], [5, 6]]

请指导我,为什么在一维列表的情况下浅表副本不起作用。

谢谢。

1 个答案:

答案 0 :(得分:0)

您想要的实际上有3个“级别”。

1)创建对相同列表的新引用。这种混叠是微不足道的操作,看起来像“原始=新”或类似的东西。 original [1] = x将更新new [1];这等效于以基于指针的语言复制指针。

original = new
original[1] = x
new[1] will now be updated to x

这应该是显而易见的,但是为了完整起见,如果按照上述步骤操作:

new = other
original is NOT affected at all. 

2)创建列表的“副本”。它将分配一个新区域并复制列表中的元素。这是“浅”副本。复制的子代将作为引用,但列表本身将包含副本。 original [1] = x不会更新new [1],但是original [1] .childValue = x不会更新new [1] .childValue

original = shallow copy of new
original[1].value = x
new[1].value WILL change to x
original[1] = y
new[1] will NOT be affected

3)创建列表的深层副本。这将分配一个新区域并浅表复制该列表,但随后将递归并复制列表中引用的每个子级。原始版本的任何更新都不会修改新版本,反之亦然。

original = deep copy of new
original[1].value = x
new[1].value will NOT be affected
original[1] = y
new[1] will NOT be affected

列表的浅表副本通常不是您想要的,因为列表处于混合状态,有些成员引用其他列表,而有些则不会导致不可预测的行为,但是如果您的树相当,则可能有必要深度和/或您从不修改子节点。