-
copy模塊:Python中的賦值語句不復制對象,它們在目標和對象之間創建綁定。對於可變或包含可變項的集合,有時需要一個副本,以便可以更改一個副本而不更改另一個副本。這個模塊提供了一般的淺層和深層復制操作。
-
copy模塊是python內建模塊,只需要使用import語句導入即可:
import copy
-
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]
'''結論:修改淺拷貝內層對象 不會 影響原對象'''
'''總結:深拷貝會創建新對象,其內容是原對象的引用;深拷貝拷貝了原對象的所有對象,包括嵌套對象''' -
