• Python中的深浅拷贝


    1.什么是深浅拷贝?

    python中一切皆对象,python中的数字、字符串、元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的内存空间是可以被修改的。

    下面我们定义一个列表:

    list=[1,2,3,4,5]

    list1=list

    list[0]=6

    >>>list

    [6,2,3,4,5]

    >>>list1

    [6,2,3,4,5]

    如果我们只想改变list,问题就出现了。

    赋值操作 list1 = list,是浅拷贝,当list的值改变的时候,list1的值跟着改变。

    2.用for和[:]实现浅拷贝

    list = [1,2,3,4,5]  

    list2= [ i for i in list]  //list2=list[:]

    list2[-1]=0

    >>> list

    >>> list2

    [1, 2, 3, 4, 5] 

    [1, 2, 3, 4, 0] 

    上面的例子,用for循环生成新的list2对象或者[:]切片赋值得到的list2,当改变list2的值时,list的值没有跟着改变,这就是深拷贝吗?且继续往下看:

    3.

    list = [1, 2, 3, [1,2009] ]  

    list3 = [ i for i in list]  //list2=list[:]

    list3[-1].append(2009)

    >>> list 

    >>> list3 

    [1, 2, 3, [1, 2009, 2009]]

    [1, 2, 3, [1, 2009, 2009]]  

    3 和  2难道有矛盾?不。

    解释:for循环操作的时候,把list中的每一个对象的引用拷贝,而list中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:

    4

     for i in list:  

     print id(i)       

    3630168  

    3630156  

    3630144  

    46784880  

    for i in list3:  

    print id(i)

    3630168  

    3630156  

    3630144  

    46784880 

    那么,在pyhton,深拷贝在哪呢?不急,下面就是了

    5.

    import copy  

    list= [1, 2, 3, [1,2009] ]  

    list5 = copy.deepcopy(list)  

    >>> list 

    [1, 2, 3, [1, 2009]]  

    >>> list5

    [1, 2, 3, [1, 2009]]  

     list5[-1].append(2009)  

    >>> list5

    [1, 2, 3, [1, 2009, 2009]]  

    >>> list  

    [1, 2, 3, [1, 2009]]  

    6.总结:

    浅拷贝不会拷贝数据中的子对象。

    例如:for ,切片浅拷贝,impord copy   copy.copy

    深拷贝会拷贝数据中的子对象

    例如:impord   copy.deepcopy

     

  • 相关阅读:
    angular2+ 使用ant.design 的 select组件时(nz-select)下拉框没有脱离文档流,直接撑开页面展示的问题
    element 获取table组件的下标
    调幅调频调相位
    Mongoose基于MongoDB建模并设置关联
    Xavier上TensorRT和Pytorch运行时间对比
    理解vue实例的生命周期和钩子函数
    [Vue]组件——.sync 修饰符实现对prop 进行“双向绑定”(子组件向父组件传值)
    vm.$attrs 【Vue 2.4.0新增inheritAttrs,attrs详解】
    (转)vue v-on修饰符
    Vue中的computed属性
  • 原文地址:https://www.cnblogs.com/rourou1/p/6085444.html
Copyright © 2020-2023  润新知