zoukankan      html  css  js  c++  java
  • python中copy 与 '=' 的区别

    当你a=1000的时候a指向一个新的类,内容为1000,而b仍然指向原来指向的内容,因为你没有叫它指向其他内容。你使用=符号,使得a和b指向同一个内容,而copy则是将b的内容复制后让c指向这个拷贝的内容上了。看下面图种运行的结果。b=a,使用a改变"age",b和a中的都改变了。而c采用copy,不受影响。

    等会儿画个图补充上来就更容易理解了。

    C从来没有改变过。c中age的值一直保持在copy时获得的那个10,只有a和b在后面age变成了11。

    这个是个浅拷贝的事例,下面举个深拷贝的事例,并结合浅拷贝,

    c采用浅拷贝,d采用深拷贝,修改a中age的值,a和b的都改变了,c和d的没有改变,但是修改a中“d”里的list,则导致abc中list都改变,d中是深拷贝的则没有改变。

    详细看最下补充的图:

    a = {"d": ["a", "1"], "age": 10}
    b = a 
    c = a.copy()
    from copy import deepcopy
    d = deepcopy(a)
    print "before:"
    print "a:", a
    print "b:", b
    print "c:", c
    print "d:", d
    a["d"].append("c")
    a["age"] = 11
    print "after:"
    print "a:", a
    print "b:", b
    print "c:", c
    print "d:", d
    
    
    #=>结果
    before:
    a: {'age': 10, 'd': ['a', '1']}
    b: {'age': 10, 'd': ['a', '1']}
    c: {'age': 10, 'd': ['a', '1']}
    d: {'age': 10, 'd': ['a', '1']}
    after:
    a: {'age': 11, 'd': ['a', '1', 'c']}
    b: {'age': 11, 'd': ['a', '1', 'c']}
    c: {'age': 10, 'd': ['a', '1', 'c']}
    d: {'age': 10, 'd': ['a', '1']}

    ython中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
    2. copy.deepcopy 深拷贝 拷贝对象及其子对象
    一个很好的例子:

    import copy
    a = [1, 2, 3, 4, ['a', 'b']]  #原始对象
    
    b = a  #赋值,传对象的引用
    c = copy.copy(a)  #对象拷贝,浅拷贝
    d = copy.deepcopy(a)  #对象拷贝,深拷贝
    
    a.append(5)  #修改对象a
    a[4].append('c')  #修改对象a中的['a', 'b']数组对象
    
    print 'a = ', a
    print 'b = ', b
    print 'c = ', c
    print 'd = ', d


    输出结果:
    a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
    c =  [1, 2, 3, 4, ['a', 'b', 'c']]
    d =  [1, 2, 3, 4, ['a', 'b']]

  • 相关阅读:
    多线程之旅:避免死锁——简单的锁分级(锁排序)
    和我一起来学iOS(三)UIView及其子类(上)
    谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用
    和我一起来学iOS(二)iOS中的一些约定、模式与三种回调机制
    多线程之旅六——异步编程模式,自己实现IAsyncResult
    详解JavaScript中的函数与闭包
    和我一起来学iOS(一)ObjectC的语法
    浅谈SQL SERVER中的物理联接算法
    多线程之旅之三——Windows内核对象同步机制
    深入 聚集索引与非聚集索引(一)
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6031039.html
Copyright © 2011-2022 走看看