- 可变数据类型:list(列表),dict(字典),set(集合)
- 不可变数据类型:number(数字),string(字符串),tuple(元组)
- 直接赋值:就是对象的引用。
- 浅拷贝:拷贝父对象,不会拷贝对象的内部子对象。
- 深拷贝:完全拷贝父对象以及子对象。
可变数据类型时,直接赋值、浅拷贝、深拷贝:
可以看到a是可变数据类型时:
直接赋值是对象的引用,b和a内存地址相同。
而浅拷贝和深拷贝都是不同的内存地址。
不可变数据类型时,直接赋值、浅拷贝、深拷贝:
当a是不可变数据类型时:
直接赋值、浅拷贝和深拷贝,的内存地址都是一样的。
结论一:
不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址
不管深拷贝还是浅拷贝对可变数据类型都是会重新创建新的内存空间
浅拷贝嵌套:
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
深拷贝嵌套:
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址相同
#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
print(id(a[1]),id(copy_a[1])) # 内存地址不相同
# 情况一, 可变数据类型 内嵌不可变数据类型
import copy
a = [(1,2),(3,4)] # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
结论二:
浅拷贝嵌套:外层是可变类型,不管内层是否可变都是指向新的内存地址。
外层是不可变类型,不管内层是否可变都是对象引用,相同的内存地址。
深拷贝嵌套:外层是不可变类型时,会递归判断内层类型,如果可变则指向新的内存地址,不可变就是对象引用。
外层是可变类型时,不管内层是否可变都指向新的内存地址,但是内部如果为可变则递归创建、不可变则为引用地址。