深拷贝和浅拷贝
一、浅拷贝与深拷贝
1. 浅拷贝
拷贝最外层的对象,内部的元素只拷贝了引用(指向是一样的)
2. 深拷贝
外层对象和内部元素都拷贝了一遍(都有一块新空间)
3. 解释:
比如有一个l = [2,4,6,8]这个列表里的每一个元素都有一个自己的一个地址,这个地址就是相当于列表元素的空间,拷贝外层对象就是拷贝这个列表自己的空间而不是元素的空间。
所以浅拷贝中拷贝最外层的对象就是拷贝了这个列表的空间,内部元素只拷贝了引用是指他们的元素的空间(地址)是没有改变的; 而深拷贝就是最外层的跟元素的空间都拷贝了,都有了自己的新空间。
二、举例
# 1. 引用 : 两个列表的空间是一样的(引用实际上就是给t1取了一个小名。)
t1 = [2,4,6,8,22]
t2 = t1
print(id(t1),id(t2)) # 35800776 35800776
# 2. 浅拷贝 :两个列表的空间不一样,列表中的元素的空间是一样的
t3 = t1[:]
print(id(t3)) # 35800712 t3是另一块空间
t4 = t1.copy()
# 3. 深拷贝:两个列表的空间不一样,列表中的元素的空间也不一样
from copy import *
t5 = deepcopy(t1)
三、深浅拷贝的补充
1、浅拷贝
a = [1, 23, 4,[10,20]]
b = a.copy()
print(id(a), id(b))
print(id(a[0]), id(b[0]))
b[0] = 2
print(a,b)
print(id(a[0]), id(b[0]))
a[3][0] = 100
print(a,b)
2、深拷贝
import copy
a = [1,23,4,5,6,9,[10,20]]
b = copy.deepcopy(a)
print(id(a),id(b))
print(id(a[0]),id(b[0]))
a[0] = 22
print(a,b)
a[6][0] = 100
print(a,b)