zoukankan      html  css  js  c++  java
  • Python面试题之copy/deepcopy详解

    copy和deepcopy有什么区别?

    http://blog.csdn.net/qq_32907349/article/details/52190796

    http://iaman.actor/blog/2016/04/17/copy-in-python

    我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
    而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

    对于简单的 object,用 shallow copy 和 deep copy 没区别

    复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。

    
    
    import copy
    # a = 123
    # b = 123
    # c = a
    # print(id(a))
    # print(id(b))
    # print(id(c))
    # 1345408560
    # 1345408560
    # 1345408560

    # a1 = copy.copy(a)
    # a2 = copy.deepcopy(a)
    # print(id(a1))
    # print(id(a2))
    # 1345408560
    # 1345408560


    # n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
    # # n2 = n1
    # n2 = copy.copy(n1)
    # # n2 = copy.deepcopy(n1)
    # print(id(n1))
    # print(id(n2))
    # n2['k3'][0] = 3
    # print(n2)
    # print(n1)
    # print(id(n1))
    # print(id(n2))
    # 16596928
    # 16642096
    # {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
    # {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
    # 16596928
    # 16642096


    # n1 = {'k1':123,'k2':'abc','k3':[1,'bv']}
    # n2 = n1
    # n2 = copy.copy(n1)
    # n2 = copy.deepcopy(n1)
    # print(id(n1))
    # print(id(n2))
    # n2['k3'][0] = 3
    # print(n2)
    # print(n1)
    # print(id(n1))
    # print(id(n2))
    # print(id(n1['k3']))
    # print(id(n2['k3']))
    # 51986368
    # 53434384
    # {'k1': 123, 'k2': 'abc', 'k3': [3, 'bv']}
    # {'k1': 123, 'k2': 'abc', 'k3': [1, 'bv']}
    # 51986368
    # 53434384
    # 53427456
    # 53427496

    dic = {
    'cpu':[80,],
    'mem':[80,],
    'hdd':[80,],
    }

    new_dic = copy.deepcopy(dic)
    print(dic)
    print(new_dic)
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    print("*"*60)
    new_dic['cpu'][0] = 70
    print(dic)
    print(new_dic)

    # new_dic = copy.copy(dic)
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # ************************************************************
    # {'cpu': [70], 'mem': [80], 'hdd': [80]}
    # {'cpu': [70], 'mem': [80], 'hdd': [80]}


    # new_dic = copy.deepcopy(dic)
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # ************************************************************
    # {'cpu': [80], 'mem': [80], 'hdd': [80]}
    # {'cpu': [70], 'mem': [80], 'hdd': [80]}
     
  • 相关阅读:
    [读书笔记]捉虫日记
    花生壳建站全过程
    (step4.3.9)hdu 1584(蜘蛛牌——DFS)
    鼠标移到导航上面 当前的LI变色 处于当前的位置
    JavaScript学习笔记
    由Maximum Gap,对话桶排序,基数排序和统计排序
    安德鲁斯Launcher得到的装在手机的应用程序列表
    broadAnywhere:Broadcast组件权限绕过漏洞(Bug: 17356824)
    Ubuntu logomaker sh: 1: pngtopnm: not found 解决方案
    HDU 1598 find the most comfortable road (罗列+Kruskal) 并检查集合
  • 原文地址:https://www.cnblogs.com/william126/p/7107473.html
Copyright © 2011-2022 走看看