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

    1、赋值:

    1 list_1=[['a','b'],1,2]
    2 list_2=list_1
    3 
    4 print(list_1)
    5 print(list_2)
    
    >>>[['a', 'b'], 1, 2]
    >>>[['a', 'b'], 1, 2]

    在python3中赋值操作其实就是对象的应用,如上边的例子list_1与list_2这俩变量指向的都是同一块内存地址,也就是说list_2并没有重新开辟一块属于自己内存空间。

    (通过id( )函数可以查看对象的内存地址)

    1 print(id(list_1))
    2 print(id(list_2))

    >>>1656445373192
    >>>1656445373192

    共同指向同一个内存地址(1656445373192),如果把这块内存空间看成一个房间的话,那就是给这个房间找了两个主人,房间里的所有东西属于两人的公共财产,同进退,共生死!

     1 list_1=[['a','b'],1,2]
     2 list_2=list_1
     3 
     4 list_2[0][0]="aaa"
     5 list_1[2]=222
     6 
     7 print(list_1)
     8 print(list_2)
     >>>[['aaa', 'b'], 1, 222]
    >>>[['aaa', 'b'], 1, 222]
    10 del list_1 #deL函数只能删除变量名,对内存地址不做操作 11 print(list_2)
    >>>[['aaa', 'b'], 1, 222]

    11 list_2.clear() #clear()函数不删除变量名,但会清除对应的内存空间
    12 print(list_1)
    >>>[]

    2、浅拷贝

    1 list_1=[['a','b'],1,2]
    2 
    3 #浅拷贝的三种形式,结果是一样的
    4 list_2=list_1.copy()
    5 list_2=list_1[:]
    6 
    7 import  copy
    8 list_2=copy.copy(list_1)

    浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层

    1 list_1=[['a','b'],1,2]
    2 list_2=list_1.copy()
    3 
    4 list_2[0][0]="aaa"
    5 list_2[2]=222
    6 print(list_1)
    7 print(list_2)
    >>>[['aaa', 'b'], 1, 2]
    >>>[['aaa', 'b'], 1, 222]

    如图所说:list_2=list_1.copy() 其实等于 list_2=[[000123],1,2]。也就是说只有小列表中的元素是两人的公共财产(好比俩人的孩子),1和2 赋予各自的私有财产。

    3、深拷贝

     1 list_1=[['a','b'],1,2]
     2 
     3 import copy
     4 list_2=copy.deepcopy(list_1)
     5 
     6 list_2[0][0]="aaa"
     7 list_2[2]=222
     8 
     9 print(list_1)
    10 print(list_2)
    >>>[['a', 'b'], 1, 2]
    >>>[['aaa', 'b'], 1, 222]

    深拷贝就比较直接了,就是很单纯的很粗暴的克隆一份数据出来自己玩,自己想咋作就咋作,跟别人无关。

    4、拷贝的警告  

      1、对于非容器类型,如数字,字符,以及其它“原子”类型,没有拷贝一说。产生的都是原对象的引用。

      2、如果元组变量值包含原子类型对象,即使采用了深拷贝,也只能得到浅拷贝。

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/Adairye/p/8570929.html
Copyright © 2011-2022 走看看