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))
posted @ 2020-03-12 17:19  InkCat  阅读(119)  评论(0编辑  收藏  举报