zoukankan      html  css  js  c++  java
  • python进阶(6)深拷贝和浅拷贝

    深拷贝和浅拷贝

    不管对于浅拷贝、还是深拷贝,针对不可变对象str、int、tuple(有点特殊)、boolean,它的内存地址是不变的,拷贝的仅仅是值

    import copy
    
    
    a = 1
    b = copy.copy(a)  # 浅拷贝a
    c = copy.deepcopy(a)  # 深拷贝a
    print(a is b)
    print(a is c)
    
    >>> True
    >>> True
    
    is比较的是二者的内存地址是否相同
    

    浅拷贝

    浅拷贝只拷贝可变对象的第一层,如果可变对象中还有可变的对象,那么第二层拷贝不到,拷贝不到就是说,第二层的内存地址是共用的,都是指向同一片内存地址

    import copy
    
    
    a = [1, 2, [3, 4]]
    b = copy.copy(a)
    print(a is b)
    print(a[2] is b[2])
    
    >>> a的内存地址 140369750660592
    >>> b的内存地址 140369750677376
    >>> False
    >>> a[2]的内存地址 140369750677056
    >>> b[2]的内存地址 140369750677056
    >>> True
    
    浅拷贝只拷贝第一层,所以b拷贝出来的内存地址是与a不同的,
    但因为浅拷贝只能拷贝第一层,所以b[2]这个列表拷贝不到,指向的内存地址仍然是a[2]的内存地址
    

    深拷贝

    深拷贝对于可变的对象,全部拷贝下来,全部都开辟一片新的内存地址

    import copy
    
    
    a = [1, 2, [3, 4]]
    b = copy.deepcopy(a)
    print('a的内存地址', id(a))
    print('b的内存地址', id(b))
    print(a is b)
    print('a[2]的内存地址', id(a[2]))
    print('b[2]的内存地址', id(b[2]))
    print(a[2] is b[2])
    
    >>> a的内存地址 140312626337184
    >>> b的内存地址 140312626353968
    >>> False
    >>> a[2]的内存地址 140312626353648
    >>> b[2]的内存地址 140312626337264
    >>> False
    
  • 相关阅读:
    你爱的不爱你,转身是幸福
    按字节长度截取字符串(支持截取带HTML代码样式的字符串)
    存储过程操作类
    C# 拖动控件
    文件同步类
    c# 动态改变控件大小的方法
    虚拟世界改变现实 盛大兴建永恒之塔
    c#百钱买百鸡
    序列化类
    DLL专题之MFC规则库和扩展库
  • 原文地址:https://www.cnblogs.com/jiakecong/p/14448152.html
Copyright © 2011-2022 走看看