zoukankan      html  css  js  c++  java
  • python中的深拷贝与浅拷贝

    常见面试题中有深拷贝与浅拷贝的区别;

    浅拷贝:只拷贝地址,不拷贝值,两个变量共享同一个对象;
    深拷贝:拷贝值,如果列表中也是引用,就递归拷贝;
    a = [11,22]
    b = [33,44]
    c = [a,b]
    d = c
    id(c)
    id(d)

    可以看出,c和d的内存地址即ID相同,这是典型的浅拷贝,如果改变a的值,那么c和d都会改变;

    import copy
    d = copy.deepcopy(c)
    id(d)

    此时d的ID是不同于c的,而且copy.deepcopy()是递归拷贝的,即改变a、b或者c的值,都不会影响到d,这就是深拷贝;

    copy模块中还有一个容易混淆的copy.copy()函数,那么它与copy.deepcopy()有什么不同呢?

    e = copy.copy(c)

    此时e和c的ID是不同的,如果改变c的值,e不会改变,而如果改变a或b的值,那么e就会相应改变,说明copy.copy()只是深拷贝了第一层,第二层还是浅拷贝;

    此时的拷贝对象c是一个可变的列表类型,如果是不可变的数据类型呢?

    c2 = (a,b)
    e2 = copy.copy(c2)
    id(c2)
    id(e2)

    此时发现c2与e2的地址又是相同的;那么我们可以从中分析出copy.deepcopy()与copy.copy()的拷贝规律,即:

    copy.deepcopy()总是深拷贝,支持递归拷贝;
    copy.copy()  先判断拷贝类型,如果可变,只深拷贝第一层,不支持递归拷贝;如果不可变(如元组),就浅拷贝。

  • 相关阅读:
    Find a way(两个BFS)
    ACM代码模板
    ElasticSearch-集群
    ElasticSearch-倒排索引
    ElasticSearch-IK分词器
    ElasticSearch-数据类型
    ElasticSearch-REST APIS
    cmd命令行中的errorlevel和延迟赋值
    ubuntu 12.04内核升级到3.13.1
    ubuntu 12.04安装TP-LINK TL-WN725N v2
  • 原文地址:https://www.cnblogs.com/chaofan-/p/8525349.html
Copyright © 2011-2022 走看看