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]}
     
  • 相关阅读:
    函数特化
    模板函数总结
    学习代码1
    宏指令
    #define宏作用
    oracle 重要函数
    JMeter 系列之—-01 使用
    Selenium系列之--03 常见元素操作总结
    【转】TestNG常用注解
    CMMI 2,3,4,5级涉及的过程域(PA)介绍
  • 原文地址:https://www.cnblogs.com/william126/p/7107473.html
Copyright © 2011-2022 走看看