IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]5.7 copy--简单拷贝和深度拷贝对象

    caimouse发表于 2016-01-23 21:54:12
    love 0

    在Python里的赋值语句是不拷贝对象的,它只是让目标和对象之间进行绑定。对于一些可变的容器来说,有时需要修改容器的内容,但不影响之前的对象。因此本模块提供了简单拷贝和深度拷贝对象的功能。

     

    copy.copy(x) 

    返回一个简单拷贝的对象。

    例子:

    #python 3.4

    import copy

     

    l = [2, 4]

    x = copy.copy(l)

    print(x)

    结果输出如下:

    [2, 4]

     

    copy.deepcopy(x) 

    返回一个深度拷贝的对象。

    例子:

    #python 3.4

    import copy

     

    l = [2, 4]

    x = copy.deepcopy(l)

    print(x)

    结果输出如下:

    [2, 4]

     

    exception copy.error 

    抛出模块指定的异常。

     

    在简单拷贝和深度拷贝对于复杂的可变对象(比如列表里包括列表,字典里包括列表)是不一样的处理:

    l 简单拷贝的处理:构造一个新的复合对象,然后原来对象的引用增加,然后放到复合对象里。

    l 深度拷贝的处理:构造一个新的复合对象,然后递归地拷贝内部包含的对象到复合对象里。

    深度拷贝比简单拷贝存在两个比较大的问题:

    l 递归对象时会出现死循环,比如复合对象里直接或间接地相互引用。

    l 由于深度拷贝会拷贝所有数据,即使共享的管理结构的数据也会拷贝。

    因此深度拷贝函数deepcopy()为会避免上面的问题,采用下面的方法来处理:

    l 保持一个标记字典来指示那一个对象已经拷贝过。

    l 由用户来自定义一个拷贝函数或者设置复合对象的拷贝。

    本模块不会拷贝的类型:模块、方法、栈跟踪、运行框架、文件、网络socket、窗口、数组或简单类型。同时不会拷贝函数和类,保持原来的对象不变,与模块pickle保持一致。

    简单拷贝时,对于字典可以使用dict.copy()拷贝,对于列表可以使用切割方法:copied_list = original_list[:]。

     

    例子:

    #python 3.4

    import copy

     

    l = [2, 4, ['a', 'b']]

    x = copy.deepcopy(l)

    y = copy.copy(l)

    print('deepcopy:', x, 'copy:', y)

    l[2][0] = 'c'

    print('deepcopy:', x, 'copy:', y)

    结果输出如下:

    deepcopy: [2, 4, ['a', 'b']] copy: [2, 4, ['a', 'b']]

    deepcopy: [2, 4, ['a', 'b']] copy: [2, 4, ['c', 'b']]

     




    蔡军生 QQ:9073204  深圳



沪ICP备19023445号-2号
友情链接