python 深浅拷贝
在Python中,深拷贝和浅拷贝是两种不同的对象复制方式,它们的主要区别在于复制对象时的深度和范围。
将一个列表直接赋值给另一个列表,这不叫拷贝
list1 = [
'aaa',
'bbb',
[1,2]
]
list2 = list1
二者分隔不开,list1改list2也跟着改,因为这两个列表指向的就是同一个地址
list1[0]='ccc'
print("list1: ", list1)
print("list2: ", list2)
结果如下
list1: ['ccc', 'bbb', [1, 2]]
list2: ['ccc', 'bbb', [1, 2]]
需求:
1、拷贝一下原列表产生一个新的列表
2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作
(改其中的一个列表不影响另外一个列表)
浅拷贝
浅拷贝(copy())主要用于复制对象的基本属性,而不包括对象内部的子对象。这意味着如果你有一个包含列表或其他复杂对象的字典,那么当你对这个字典进行浅拷贝时,它的新副本中的列表仍然是原始列表的引用,而不是列表的副本
list1=[
'aaa',
'bbb',
[1,2]
]
list2 = list1.copy()
list1[0]='ccc'
print("list1: ", list1)
print("list2: ", list2)
结果如下
list1: ['ccc', 'bbb', [1, 2]]
list2: ['aaa', 'bbb', [1, 2]]
对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的内存地址,并不会影响新列表
但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,两个列表中的可变类型仍然是同一个地址,于是新列表也跟着一起受影响,如下
list1[2][1]='555'
print("list1: ", list1)
print("list2: ", list2)
结果如下:
list1: ['ccc', 'bbb', [1, '555']]
list2: ['aaa', 'bbb', [1, '555']]
总结:浅copy是把原列表第一层的内存地址不加区分完全copy一份给新列表
深拷贝
要想copy得到的新列表与原列表的改操作完全独立开,必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy
深拷贝(deepcopy())是另一种复制对象的方法,它不仅复制对象的基本属性,还会递归地复制对象中的所有子对象。这意味着如果你使用深拷贝复制了一个包含列表或其他复杂对象的字典,那么在新副本中,这些列表将会是列表的完整副本,而不是原始列表的引用
import copy
list1=[
'aaa',
'bbb',
[1,2]
]
list2 = copy.deepcopy(list1)
list1[0]='ccc'
print("list1: ", list1)
print("list2: ", list2)
list1[2][1]='555'
print("list1: ", list1)
print("list2: ", list2)
结果如下
list1: ['ccc', 'bbb', [1, 2]]
list2: ['aaa', 'bbb', [1, 2]]
list1: ['ccc', 'bbb', [1, '555']]
list2: ['aaa', 'bbb', [1, 2]]