一、浅拷贝
浅拷贝是对于一个对象的顶层拷贝,通俗的理解是拷贝了引用,并没有拷贝内容,新变量与被拷贝变量指向同一个对象
1.“=”
a = [1,2]
b = a
print(id(a))
print(id(b))
打印结果:
2896016500104
2896016500104
- 可以看出a和d的内存地址相同,所以a、b是同一个对象。
- 浅拷贝仅拷贝了引用
深拷贝是拷贝了内容,而不是拷贝了引用
1. 内容拷贝“copy.deepcopy()”
import copy
a = [1,2]
b = [3,4]
c = [a,b] #注意,这里c里面是a、b
d = copy.deepcopy(c) #深拷贝
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容
打印结果:
2519870268296
2519870268232
[[1, 2, 5], [3, 4]]
[[1, 2], [3, 4]]
- 可以看出,c、d的内存地址不一样,c、d不是同一个对象。
- 由于d在a添加5之前对c进行了全部内容的拷贝(即拷贝了c值、a值、b值),所以d等于a添加5之前c的内容。
- 在deepcopy的时候,即便c换成元组,c和d的地址也不一样,所以这种方式的拷贝会深层的拷贝内容,会把所有的内容都拷贝下来。
2. 仅拷贝一层 “copy.copy()”
import copy
a = [1,2]
b = [3,4]
c = [a,b] #注意,这里c里面是a、b
d = copy.copy(c) #深拷贝,仅拷贝一层
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容
打印结果:
2396509037448
2396509037384
[[1, 2, 5], [3, 4]]
[[1, 2, 5], [3, 4]]
- 可以看出c、d的内存地址不一样,所以c、d不是同一个对象。
- 由于d仅对c进行了一层拷贝(拷贝了c值、a引用、b引用),所以d中内容跟c中一样。
如果c是元组:
import copy
a = [1,2]
b = [3,4]
c = (a,b) #注意,这里c里面是a、b
d = copy.copy(c) #深拷贝,仅拷贝一层
a.append(5)
print(id(c)) #id() 函数用于获取对象的内存地址
print(id(d))
print(c) #打印浅拷贝的内容
print(d) #打印深拷贝的内容
打印结果:
2176493807496
2176493807496
([1, 2, 5], [3, 4])
([1, 2, 5], [3, 4])
- 可以看出c和d的内存地址一样,说明c、d是同一个对象。
- 由于对于元组这个不可变类型,仅拷贝一层没有意义,所以copy.copy的时候会判断被拷贝对象是否是可变类型,如果是不可变类型,仅相当于拷贝了引用(浅拷贝)。