首先,我们知道Python3中,有6个标准的数据类型,他们又分为可变和不可变。
不可变数据(3个):
- Number(数字)
- String(字符串)
- Tuple(元组)
可变数据(3个):
- List(列表)
- Dictionary(字典)
- Set(集合)
浅拷贝和深度拷贝 总结
浅拷贝
copy模块里面的copy方法实现
- 对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
- 对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝。
- 浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。(操作拷贝对象对原始对象的也是同理)
深拷贝
copy模块里面的deepcopy方法实现
- 浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)
- 经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了
最近开始整理python的资料,博主建立了一个qq群,希望给大家提供一个交流的同平台 78486745 。
浅拷贝
- 对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
- 对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
- 浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。 (操作拷贝对象对原始对象的也是同理)
可变类型和不可变类型在浅拷贝中的区别
import copy
# 不可变类型 Number String Tuple
print("对于不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间拷贝值")
num1 = 17
num2 = copy.copy(num1)
print("num1:" + str(id(num1)))
print("num2:" + str(id(num1)))
# num1和num2的地址都相同
str1 = "hello"
str2 = copy.copy(str1)
print("str1:" + str(id(str1)))
print("str2:" + str(id(str2)))
# str1和str2的地址都相同
tup1 = (18, "tom")
tup2 = copy.copy(tup1)
print("tup1:" + str(id(tup1)))
print("tup2:" + str(id(tup2)))
# tup1和tup2的地址都相同
print("="*20)
print("对于可变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间),进行浅拷贝")
list1 = [11,12]
list2 = copy.copy(list1)
print("list1:" + str(id(list1)))
print("list2:" + str(id(list2)))
# list1和list2的地址不相同
dic1 = [11,12,"hi"]
dic2 = copy.copy(dic1)
print("dic1:" + str(id(dic1)))
print("dic2:" + str(id(dic2)))
# dic1和dic2的地址不相同
set1 = {
"AA","BB"}
set2 = copy.copy(set1)
print("set1:" + str(id(set1)))
print("set2:" + str(id(set2)))
# set1和set2的地址不相同
输出:
对于不可 变类型 Number