copy模块:Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变或包含可变项的集合,有时需要一个副本,以便可以更改一个副本而不更改另一个副本。这个模块提供了一般的浅层和深层复制操作。
copy模块是python内建模块,只需要使用import语句导入即可:import copy
浅拷贝实现:copy.copy(),工厂方法,[:]
浅拷贝会创建新对象,其内容是原对象的引用。
浅拷贝只拷贝父对象,不会拷贝父对象的内部子对象,对父对象的再次修改,不会影响浅拷贝结果,对子对象的再次更改,会影响浅拷贝的结果。
import copy
list_copy = [1,2,{1,2,3,4},4,5]
list_copy1 = copy.copy(list_copy)
print(list_copy,id(list_copy),‘<>‘,list_copy1,id(list_copy1))
# [1, 2, {1, 2, 3, 4}, 4, 5] 41050760 <> [1, 2, {1, 2, 3, 4}, 4, 5] 41145800
‘‘‘结论:浅拷贝会创建新对象,其内容是原对象的引用。‘‘‘
?
# 修改原对象外层
list_copy[1] = 20
print(list_copy,"<>",list_copy1)
# [1, 20, {1, 2, 3, 4}, 4, 5] <> [1, 2, {1, 2, 3, 4}, 4, 5]
‘‘‘结论:修改原对象外层对象不会对浅拷贝对象产生影响‘‘‘
?
# 修改原对象内层
list_copy[2].add(30)
print(list_copy,"<>",list_copy1)
# [1, 20, {1, 2, 3, 4, 30}, 4, 5] <> [1, 2, {1, 2, 3, 4, 30}, 4, 5]
‘‘‘结论:修改原对象内层对象会对浅拷贝对象产生影响‘‘‘
?
# 修改浅拷贝外层
list_copy1.append(100)
print(list_copy,"<>",list_copy1)
# [1, 20, {1, 2, 3, 4, 30}, 4, 5] [1, 2, {1, 2, 3, 4, 30}, 4, 5, 100]
‘‘‘结论:修改浅拷贝外层对象不会影响原对象‘‘‘
?
# 修改浅拷贝内层
list_copy1[2].add(100)
print(list_copy,"<>",list_copy1)
# [1, 20, {1, 2, 3, 4, 100, 30}, 4, 5] <> [1, 2, {1, 2, 3, 4, 100, 30}, 4, 5, 100]
‘‘‘结论:修改浅拷贝内层对象会影响原对象‘‘‘
深层复制:
深拷贝实现:copy.deepcopy()
深拷贝会创建新对象,其内容是原对象的引用
深拷贝会拷贝父对象,也会拷贝父对象内部子对象:
对父对象或者子对象的更改,不影响浅拷贝结果。
import copy
list_deepcopy = [1,2,{1,2,3,4},4,5]
list_deepcopy1 = copy.deepcopy(list_deepcopy)
print(list_deepcopy,id(list_deepcopy),‘<>‘,list_deepcopy1,id(list_deepcopy1))
# [1, 2, {1, 2, 3, 4}, 4, 5] 40198792 <> [1, 2, {1, 2, 3, 4}, 4, 5] 40293832
‘‘‘结论:深拷贝会创建新对象,其内容是原对象的引用。‘‘‘
?
# 修改原对象外层
list_deepcopy[1] = 20
print(list_deepcopy,"<>",list_deepcopy1)
# [1, 20, {1, 2, 3, 4}, 4, 5] <> [1, 2, {1, 2, 3, 4}, 4, 5]
‘‘‘结论:修改原对象外层对象 不会 对深拷贝对象产生影响‘‘‘
?
# 修改原对象内层
list_deepcopy[2].add(30)
print(list_deepcopy,"<>",list_deepcopy1)
# [1, 20, {1, 2, 3, 4, 30}, 4, 5] <> [1, 2, {1, 2, 3, 4}, 4, 5]
‘‘‘结论:修改原对象内层对象 不会 对深拷贝对象产生影响‘‘‘
?
?
list_deepcopy1.append(100)
print(list_deepcopy,"<>",list_deepcopy1)
# [1, 20, {1, 2, 3, 4, 30}, 4, 5] <> [1, 2, {1, 2, 3, 4}, 4, 5, 100]
‘‘‘结论:修改浅拷贝外层对象 不会 影响原对象‘‘‘
?
list_deepcopy1[2].add(100)
print(list_deepcopy,"<>",list_deepcopy1)
# [1, 20, {1, 2, 3, 4, 30}, 4, 5] <> [1, 2, {1, 2, 3, 100, 4}, 4, 5, 100]
‘‘‘结论:修改浅拷贝内层对象 不会 影响原对象‘‘‘
?
‘‘‘总结:深拷贝会创建新对象,其内容是原对象的引用;深拷贝拷贝了原对象的所有对象,包括嵌套对象‘‘‘
原文:https://www.cnblogs.com/bright-future/p/14727602.html