本文共 2615 字,大约阅读时间需要 8 分钟。
对于不可变数据类型: 浅拷贝仅仅是将拷贝生成对象指向被拷贝对象的内存地址id,并未开辟新的内存空间。所以如果修改被拷贝对象的数值,新生成的对象会开辟新的内存空间,数值也不会改变。
对于可变数据类型(主要): 浅拷贝会在最外层开辟新的空间地址,而里面的元素地址还是指向原被拷贝对象。所以如果修改被拷贝对象里面元素的数值,新生成的对象里面元素的数值也会改变;反之亦然。
对于不可变数据类型: 和浅拷贝一样,深拷贝仅仅是将拷贝生成对象指向被拷贝对象的内存地址id,并未开辟新的内存空间。修改被拷贝对象的数值,新生成的对象会开辟新的内存空间,数值也不会改变。
对于可变数据类型(主要): 深拷贝本质上是将对象进行递归浅拷贝,被拷贝对象的所有层级中的数据,都会拷贝给新生成的对象,并赋予新的内存地址id,也就是说新生成的对象将完全独立于被拷贝对象。
无论是 “可变数据类型” 还是 “不可变数据类型” ,赋值都是对象的引用。
list1 = [1,2,3,4,5]print(id(list1))list2 = list1list1.append(6)print(id(list1),id(list2))print(list1,list2)#------output---------------140500261430344140500261430344 140500261430344[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
strs = "test"print(id(strs))str1 = strsprint(id(str1))strs = strs.upper()print(id(strs),id(str1))#------output---------------140501313245904140501313245904140500261499544 140501313245904
1)copy模块
import copy temp = ['a', 'b']a = [1, 2, 3, temp]b = copy.copy(a)print(id(a),id(b),id(temp),id(a[3]),id(b[3]))#------output---------------140500262299080 140500261881224 140500261477064 140500261477064 140500261477064
2)切片(列表)
temp = ['a', 'b']a = [1, 2, 3, temp]b = a[:]print(id(a),id(b),id(temp),id(a[3]),id(b[3]))#------output---------------140500261491464 140500261430600 140500262041800 140500262041800 140500262041800
3)自建copy模块
list:temp = ['a', 'b']list1 = [1, 2, 3, temp]list2 = list1.copy() # 浅拷贝print(id(list1),id(list2),id(temp),id(list1[3]),id(list2[3]))#------output---------------140500261430664 140500676581576 140500261491144 140500261491144 140500261491144
dict:
temp = [7,8,9]dict1 = { "a":123,"b":456,"c":temp}dict2 = dict1.copy() print(id(dict1),id(dict2),id(temp),id(dict1["c"]),id(dict2["c"]))#------output---------------140500261887864 140500261497016 140500261477256 140500261477256 140500261477256
copy模块
import copy temp = ['a', 'b']a = [1, 2, 3, temp]b = copy.deepcopy(a)print(id(a),id(b),id(temp),id(a[3]),id(b[3]))#------output---------------140500262236616 140500261491464 140500261430344 140500261430344 140500261476616
转载地址:http://dsili.baihongyu.com/