python標准庫--copy模塊


copy模塊簡介

  • 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]
    '''結論:修改淺拷貝內層對象 不會 影響原對象'''

    '''總結:深拷貝會創建新對象,其內容是原對象的引用;深拷貝拷貝了原對象的所有對象,包括嵌套對象'''

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM