切片分配,浅/深拷贝

时间:2017-11-06 12:03:06

标签: python slice deep-copy shallow-copy

所以,我理解这一点:

a_list = [1,2,3]
b_list = [5,6,7]
a_list.append(b_list) 

a_list目前为[1,2,3, [5,6,7]]

c_list = a_list[:]
b_list[0] = 1000
print(a_list, c_list)

a_list是[1,2,3,[1000,6,7]]

c_list为[1,2,3,[1000,6,7]]

a_listc_list都已更改,因为当b_list附加到a_list时,b_list引用了[5,6,7],并且更改为b_list会显示a_listc_list中的更改。这很好。

问题在于你有:

a_list = [1, 2, [1,5,0]]
b_list = a_list[:]
a_list[2][1] = 90000
print(a_list, b_list)

a_list[1, 2, [1, 90000, 0]]b_list[1, 2, [1, 90000, 0]]

b_list为什么会改变? b_lista_list的浅表副本,如果它有引用,它将复制引用,而不是实际对象。 但是,a_list没有提及复制;它是一个确切的值,一个数字列表,如果a_list中的某些值发生变化,则b_list不应更改,因为它们完全不同,b_list未通过赋值指向a_list

1 个答案:

答案 0 :(得分:0)

Python中的

一切是一个参考。列表索引只是引用,就像名称(变量)一样。

所以a_list[2]是对列表对象的引用,就像a_list[0]是对整数对象的引用一样。您创建了a_list的浅表副本,这意味着所有3个引用都被复制到新的列表对象。

Ergo,b_list[2]引用与a_list[2]相同的对象,另一个列表对象。通过a_list[2]b_list[2]修改该列表对象将使更改可见。

如果您还需要复制引用的对象,请创建一个深层副本。您可以使用copy.deepcopy()递归复制所有内容,或使用列表解析仅创建直接嵌套列表的浅层副本。