zoukankan      html  css  js  c++  java
  • Python 深浅拷贝

    先问问大家,什么是拷贝?拷贝就是创建一个具有相同类型,相同值但不同id的新对象.
    深浅copy其实就是完全复制一份,和部分复制一份的意思。

    1、赋值运算

    l1 = [1,2,3,['tank','nick']]
    l2 = l1
    
    l1[0] = 111
    print(l1)  # [111, 2, 3, ['tank', 'nick']]
    print(l2)  # [111, 2, 3, ['tank', 'nick']]
    
    l1[3][0] = 'kevin'
    print(l1)  # [111, 2, 3, ['kevin', 'nick']]
    print(l2)  # [111, 2, 3, ['kevin', 'nick']]
    

    对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
      在举个例子,比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了,对吧?
      l1,l2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。

    2、浅拷贝

    浅拷贝是copy模块中的copy()函数

    l1 = [1, 'tank', [22, 33]]
    l2 = l1.copy()
    print(id(l1), id(l2))  # 2713214468360 2713214524680
    print(id(l1[1]), id(l2[1]))  # 2547618888008 2547618888008
    print(id(l1[-1]),id(l2[-1]))  # 2547620322952 2547620322952
    
    
    l1 = [1, 'tank', [22, 33]]
    l2 = l1.copy()
    l1[0] = 2
    print(l1)  #[2, 'tank', [22, 33]]
    print(l2)  #[1, 'tank', [22, 33]]
    
    
    l1 = [1, 'tank', [22, 33]]
    l2 = l1.copy()
    l1[-1][0] = 2
    print(l1)    #[1, 'tank', [2, 33]]
    print(l2)    #[1, 'tank', [2, 33]]
    

    在这里插入图片描述
    对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表,但是新列表中的元素与原列表中的元素是公用的。

    3、 深拷贝

    深拷贝是copy模块中的deepcopy()函数

    l1 = [1, 'tank',  [22, 33]]
    l2 = copy.deepcopy(l1)
    print(id(l1), id(l2))    # 2788324482440 2788324483016
    print(id(l1[0]),id(l2[0]))    # 1470562768 1470562768
    print(id(l1[-1]),id(l2[-1]))    # 2788324482632 2788324482696
    print(id(l1[1]),id(l2[1]))    # 2788323047752 2788323047752
    
    
    l1 = [1, 'tank',  [22, 33]]
    l2 = copy.deepcopy(l1)
    l1[1] = 0
    print(l1)   #[1, 0, [22, 33]]
    print(l2)   #[1, 'tank', [22, 33]]
    
    
    l1 = [1, 'tank',  [22, 33]]
    l2 = copy.deepcopy(l1)
    l1[-1][0] = 0
    print(l1)    #[1, 'tank', [0, 33]]
    print(l2)    #[1, 'tank', [22, 33]]
    

    在这里插入图片描述
    对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。

    深拷贝就是在内存中重新开辟一块空间,不管数据结构多么复杂,只要遇到可变类型的数据就重新开辟一块内存空间把内容复制下来,直到拷贝的数据类型都是不可变对象为止

    总结:

    1. 拷贝就是创建一个具有相同类型,相同值但不同id的新对象.
    2. 可变对象在赋值时,修改一个的值,另一个也会发生改变。
    3. 深、浅拷贝对不可变对象拷贝时,不开辟新空间,相当于赋值操作。
    4. 浅拷贝在拷贝时,只拷贝第一层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。
    5. 深拷贝 区别于浅拷贝只拷贝顶层引用,深拷贝会逐层进行拷贝,直到拷贝的所有引用都是不可变对象为止。
  • 相关阅读:
    servlet上传图片 服务器路径(转)
    图片和提交servlet的相对和绝对路径
    Intel 的面试经历中国研究院
    CentOS-6.5-x86_64 最小化安装,已安装包的总数,这些包?
    西门子PLC学习笔记8-(计时器)
    这个周末我太累了
    windows7股票的,win8残疾人,安装Han澳大利亚sinoxn个时间,sinox它支持大多数windows软体
    net.sf.json 迄今 时刻 格式 办法
    ar命令提取.a时刻,一个错误 is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    POJ 2187: Beauty Contest(旋转卡)
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143055.html
Copyright © 2011-2022 走看看