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']]

  • 相关阅读:
    intel instruction 指令速查
    WinDbg双机调试配置
    MSDN上关于WinDbg的手册
    build temu error about SDL
    taintCheck的实现
    Vim使用taglist功能
    Windows编写driver
    cabal替代脚本
    怎样理解Functor与Monad
    haskell基本语法
  • 原文地址:https://www.cnblogs.com/awishfullyway/p/6031039.html
Copyright © 2011-2022 走看看