zoukankan      html  css  js  c++  java
  • Python【每日一问】01

    问:深拷贝、浅拷贝、直接赋值的区别是什么?并举例说明

    1.区别

    (1)直接赋值对象的引用

    (2)浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象

    (3)深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象

    定义说得有点抽象,简而言之:

    深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用

    假设B复制了A,修改A的时候,看B是否发生变化:

    (1)如果B跟着也变了,说明是浅拷贝,

    (2)如果B没有改变,说明是深拷贝

    2.举例说明

    (1)直接赋值

    # 直接赋值
    # 定义列表
    names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
    # 直接赋值
    names1 = names #无论 names中修改了什么,names与names1保持完全一致
    # 修改原列表
    names[1] = "test6"
    names[-3][0] = "nice"
    # 打印结果
    print("names:",names)
    print("names1:",names1)

    输出结果:

    names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
    names1: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']

    解析:直接赋值,names 和 names1 指向同一个对象

    (2)浅拷贝

    # 浅拷贝
    # 定义列表
    names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
    # 浅拷贝列表
    names1 = names.copy()
    # 修改原列表 names
    names[1] = "test6"
    names[-3][0] = "nice"
    # 打印
    print("names:",names)
    print("names1:",names1)

    输出结果:

    names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
    names1: ['test1', 'test2', 'test3', ['nice', 'mike'], 'test4', 'test5']

    解析:浅拷贝,拷贝父对象,不会拷贝对象的内部的子对象,他们的子对象 Y 还是指向同一个对象

    (3)深拷贝

    # 深拷贝
    # 引入 copy 模块
    import copy
    names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
    names1 = copy.deepcopy(names)
    # 修改原列表
    names[-3][0] = "ken"
    # 打印结果
    print("names:",names)
    print("names1:",names3)

    输出结果:

    names: ['test1', 'test2', 'test3', ['ken', 'mike'], 'test4', 'test5']
    names1: ['test1', 'test2', 'test3', ['kangkang', 'mike'], 'test4', 'test5']

    解析:深拷贝,names 和 names1 完全拷贝了父对象及其子对象,两者完全独立

  • 相关阅读:
    BZOJ 1854 [Scoi2010]游戏
    【模板】二分图匹配-匈牙利算法
    BZOJ 1432 [ZJOI2009]Function
    BZOJ 1192 [HNOI2006]鬼谷子的钱袋
    BZOJ 1088 [SCOI2005]扫雷Mine
    BZOJ 1047 [HAOI2007]理想的正方形
    BZOJ 1034 [ZJOI2008]泡泡堂BNB
    BZOJ 1022 [SHOI2008]小约翰的游戏John
    LOJ 6278 数列分块入门2
    【BZOJ 1003】[ZJOI2006]物流运输(Dijkstra+DP)
  • 原文地址:https://www.cnblogs.com/ElegantSmile/p/10681781.html
Copyright © 2011-2022 走看看