python 深拷贝和浅拷贝
Python专门提供了一种拷贝机制,基于原对象创建一个含有相同值的对象。拷贝有copy模块提供。讲到拷贝就不得不讲一下可变和不可变对象。
可变对象
当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,称之为可变对象。
数据类型:list,set,dict
不可变对象
当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,称之为可变数据类型。
数据类型:num,str,tuple等
浅拷贝
是对于一个对象的顶层拷贝,也就是说拷贝引用。
- 对列表切片拷贝:[:]
- 调用对象拷贝:list.copy
- 模块:copy.copy
深拷贝
是对于一个对象的内容拷贝。
- 模块:copy.deepcopy()
那么它们的异同在哪呢?
可变对象 | 不可变对象 | |
---|---|---|
浅拷贝 | 拷贝外面的对象,里面元素不拷贝 | 拷贝新对象 |
深拷贝 | 对象和里面的元素都拷贝 | 拷贝新对象 |
实例
import copy
# 可变对象数据
change_variable=[1,2,45,6,0]
# 不可变对象数据
not_variable=(3,5,2,1,)
# 浅拷贝:拷贝引用(可变)
change_shallow_list=change_variable[:]
# 深拷贝:拷贝内容(可变)
change_deep_list=copy.deepcopy(change_variable)
# 浅拷贝:拷贝引用(不可变)
not_shallow_tuple=copy.copy(not_variable)
# 深拷贝:拷贝内容(不可变)
not_deep_tuple=copy.copy(not_variable)
# 当浅拷贝对象发生改变时
change_shallow_list[-1]='改变'
change_deep_list[1]='改变了'
# 当深拷贝对象发生改变时
try:
not_shallow_tuple[0]=111
except Exception as f:
print(f,'\n元组不管是什么拷贝,本身不可变')
try:
not_deep_tuple[-1]='深拷贝'
except Exception as f:
print(f,'\n元组不管是什么拷贝,本身不可变')
print('可变对象l:\t{}'.format(change_variable))
print('不可变对象t:\t{}'.format(not_variable))
print('浅拷贝可变对象:\t{}'.format(change_shallow_list))
print('深拷贝可变对象:\t{}'.format(change_deep_list))
print('浅拷贝不可变对象:\t{}'.format(not_shallow_tuple))
print('深拷贝不可变对象:\t{}'.format(not_deep_tuple))
如果把成才比作登天,自学便是成才的天梯。