今日概要

  • 深浅拷贝(重点)
  • 文件操作

详细内容

  • 直接赋值: 直接将对象的引用赋值给另一个对象

    v1=1000
    v2=v1
    #v1 v2指向同一个内存地址
    print(id(v1),id(v2))#相等
    v1="new_value
    print(id(v1),id(v2))#不等 v1=[1,2,3]
    v2=v1
    ##v1 v2指向同一个内存地址
    v1.append("45")
    print(v2)
    #[1,2,3,4,5]
    ##v1 v2指向同一个内存地址 修改v1内存地址的内容 v2也会跟着改变

    解析:
    变量中存放的都是引用地址
    当创建v1并赋值的时候,会在内存空间开辟一小块内存空间比如(001):001=1000
    v1存放该1000内存地址
    当v2=v1的时候 将该内存地址又给了v2 ==>v2也指向 001 地址 ==> v2==1000
    当v1="新变量时候" 因为 001存放的1000是不可变类型 v1需要另外开辟空间004:存储"new_value"
    此时v2还是指向001内存地址
  • 浅拷贝: 只拷贝父对象,不会拷贝子对象(只会copy一层)

  • 深拷贝:会拷贝到所有嵌套的子对象

    1. 不可变类型的copy

      按理说会另外开辟一块空间存放v2的“alex”值 ,但是由于小数据缓存池原因,使“alex”只会占用一个内存,所以v2和v1地址相等

      #1.字符串及其int型的copy
      v1="alex"
      import copy
      v2=copy.copy(v1)
      print(id(v1),id(v2))#相等 #按理说会另外开辟一块空间存放v2的“alex”值 ,但是由于小数据缓存池原因,使“alex”只会占用一个内存,所以v2和v1地址相等 #2.字符串及其int型deepcopy
      v3=copy.deepcopy(v1)
      print(id(v1),id(v2))
      #同理 地址相等
    2. 列表列表,集合,字典的拷贝

      #1.赋值
      v1=[1,2,3]
      v2=v1
      print(v2 is v1)#True
      v1.append("a")
      print(v1,v2)
      #[1,2,3,"a"]-->v1
      #[1,2,3,"a"]-->v2 #2.copy
      v1=[1,2,3]
      import copy
      v3=copy.copy(v1)
      print(v3 is v1)#False
      v1.append("abc")#对v1指向的地址进行内部修改
      print(v1,v3)
      #[1,2,3,"abc"]-->v1
      #[1,2,3] --->v3 #3.copy
      import copy
      v1 = [1,2,3,{"name":'Gao',"numbers":[7,77,88]},4,5]
      v2 = copy.copy(v1) print(v1 is v2)#False print(v1[0] is v2[0])#True
      print(v1[3] is v2[3])#True print(v1[3]['name'] is v2[3]['name'])#True
      print(v1[3]['numbers'] is v2[3]['numbers'])#True
      print(v1[3]['numbers'][1] is v2[3]['numbers'][1])#True #3.deepcopy
      v1=[1,2,3]
      import copy
      v4=copy.deepcopy(v1)
      print(v4 is v1)#False
      v1.append("aaa")
      print(v1,v4)
      #[1,2,3,"aaa"]
      #[1,2,3]
    3. (有嵌套)列表,集合,字典的拷贝


      v1=[1,2,3,["a","b"]]
      import copy #1.浅拷贝
      v3=copy.copy(v1)
      print(v3 is v1)#不等
      v1.append("GG")#v1添加
      print(v1,v3)
      #[1, 2, 3, ['a', 'b'],'GG'] --->v1
      #[1, 2, 3, ['a', 'b']] --->v3
      #v1的第一层列表改变后,v3没有改变 v1[3].append("c")
      print(v1,v3)
      #[1, 2, 3, ['a', 'b', 'c'], 'GG'] --->v1
      # [1, 2, 3, ['a', 'b', 'c']]
      #v1的第二层列表(子对象改变后) v3也跟着改变
      print(v1[3] is v3[3]) #True
      ===>v1[3] 和v3[3]指向同一个内存地址
      ===>浅拷贝只会拷贝到父对象 不会拷贝到子对象 #2.深拷贝 v1=[1,2,3,["a","b"]]
      import copy
      v4=copy.deepcopy(v1)
      print(v4 is v1)#False
      v1.append("Gao")#v1改变
      print(v4)
      #[1, 2, 3, ['a', 'b']] 没改变
      v1[3].append("c")
      print(v4)
      #[1, 2, 3, ['a', 'b']] 没改变
      print(v1[3] is v4[3])#False
      ====>深拷贝会拷贝到所有嵌套的子对象 #3.
      import copy
      v1 = [1,2,3,{"name":'gao',"numbers":[7,77,88]},4,5]
      v2 = copy.deepcopy(v1) print(v1 is v2)#False
      print(v1[0] is v2[0])#True
      print(v1[3] is v2[3])#False
      print(v1[3]['name'] is v2[3]['name'])#True
      print(v1[3]['numbers'] is v2[3]['numbers'])#False
      print(v1[3]['numbers'][1] is v2[3]['numbers'][1])#True
  • 特殊: tuple是不可变类型,但是嵌套的元组深拷贝也会有效

    v1=(1,2,3,4)
    v2=copy.copy(v1)
    print(id(v1),id(v2))#一样 v2=copy.deepcopy(v1)
    print(id(v1),id(v2))#一样 v1=(1,2,3,4,[1,2,3])
    v2=copy.copy(v1)
    print(id(v1),id(v2))#一样 v2=copy.deepcopy(v1)
    print(id(v1),id(v2))#不一样
  • 练习

    v1=[1,2,3]
    v2=copu.copy(v1)
    print(v1 ==v2)#一样
    print(v1 is v2)#不同
    print(v1[0] is v2[0])#一样 v1=[1,2,3,{'k1':'1':'k2':'2'}]
    v2=copy.deepcopy(v1)
    print(v1 == v2)#一样
    print(v1 is v2)#不同
    print(v1[0] is v2[0])#一样
    print(v1[3] is v2[3])#不同

文件操作(open/read/write/close)

    1. 关闭

总结

  1. 深浅拷贝

    • 不可变类型

      • 深浅拷贝后,内存地址本该不等 ,但是由于 (小数据缓存机制原因), , (内存地址和value值都相等),(元组tuple的深拷贝除外)
    • 可变类型

      • 浅拷贝(copy):只会拷贝第一层父对象,嵌套的子对象不会被拷贝,即就是如果嵌套的是(列表/集合/字典)只会拷贝到此类对象的引用地址,而不会深入拷贝地址中的存储值

      • 深拷贝(deepcopy):会拷贝到所有嵌套的子对象,(拷贝到不可变类型为止)

        ​ 所以拷贝的和被拷贝对象中的可变类型的内存地址都不相等

    • 特殊:tuple

      • 浅拷贝:内存地址不变
      • 深拷贝:会按照深拷贝原理
  2. 文件操作

    • 打开文件 :open("文件路径","mode=r/w/a",encoding="utf-8")

      • 打开模式 mode

        1. r
        2. w:打开文件之前会清空
        3. a
        4. r+
        5. w+
        6. a+
      • seek(2):光标位置向后移动两个字节
      • 读写追加都会根据不同的打开文件模式来自动改变光标位置
    • 操作
        • read()
        • readline()
        • readlines()
      1. 写:write
      2. 关闭:close()
    • 练习
      • 去换行 strip()

day07 深浅拷贝的更多相关文章

  1. day07 python列表 集合 深浅拷贝

    day07 python   一.知识点补充     1."".join() s = "".join(('1','2','3','4','5'))  #将字符串 ...

  2. python学习打卡 day07 set集合,深浅拷贝以及部分知识点补充

    本节的主要内容: 基础数据类型补充 set集合 深浅拷贝 主要内容: 一.基础数据类型补充 字符串: li = ["李嘉诚", "麻花藤", "⻩海峰 ...

  3. Python 从零学起(纯基础) 笔记 之 深浅拷贝

    深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...

  4. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  5. Python中的深浅拷贝

    1.什么是深浅拷贝? python中一切皆对象,python中的数字.字符串.元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的 ...

  6. Python-Day3知识点——深浅拷贝、函数基本定义、内置函数

    一.深浅拷贝 import copy #浅拷贝 n1={'k1':'wu','k2':123,'k3':['carl',852]} n2=n1 n3=copy.copy(n1) print(id(n1 ...

  7. python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典

    深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...

  8. python 学习笔记5(深浅拷贝与集合)

    拷贝 我们已经详细了解了变量赋值的过程.对于复杂的数据结构来说,赋值就等于完全共享了资源,一个值的改变会完全被另一个值共享. 然而有的时候,我们偏偏需要将一份数据的原始内容保留一份,再去处理数据,这个 ...

  9. Python开发【第二章】:Python深浅拷贝剖析

    Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...

随机推荐

  1. CSS层叠样式表--使用

    一.颜色属性 二.字体属性三.背景属性四.文本属性五.边框属性六.列表属性七.display属性八.内外边距九.float属性十.定位十一.margin定位 一.颜色属性 (1)英文单词 <p ...

  2. Scoket 服务器监听多个客户端发来的图片

    这是服务器 直接上代码 都有详细注释 注意线程需要自己手动关闭 不然程序会卡死 /* ######### ############ ############# ## ########### ### # ...

  3. HDU 6166 Senior Pan(k点中最小两点间距离)题解

    题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次.但是我们换个思路,我们把k个点按照二进制每一位的0和1分 ...

  4. [ajax] - 上传图片,视频后的路径回传及确定逻辑

    业务场景1: 后台要上传视频,图片到网站的首页或者附页,上传后,视频,图片存储到服务器或cdn,但是此时还要加确定按钮以实现该视频,图片路径数据库的插入操作. 页面展现: 点击操作按钮,触发input ...

  5. Git,Github和Gitlab简介和使用方法

    什么是Git Git是一个版本控制系统(Version Control System,VCS). 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 多年前,我在法国做第一 ...

  6. CSS之user-select——设置标签中的文字是否可被复制

    详细介绍请参考 http://www.css88.com/book/css/properties/user-interface/user-select.htm CSS样式 user-select:no ...

  7. Series.str——字符串批量处理方法

    针对dataframe中的某一行(或列)想做批量字符串处理时,可采用此方法 series.str.python内置的str方法 例如: series.str.replace('A','B')   # ...

  8. 使用Python访问微信

    itchat是一个开源的微信个人号接口,使用它我们可以很方便的访问我们个人微信号里的信息.itchat的github地址如下: https://github.com/littlecodersh/itc ...

  9. Python自学:第三章 访问列表元素

    #输出并首字母大写 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[0].title()) 输出为: T ...

  10. hdu-4856 Tunnels 状压DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4856 有若干管道,每个管道有且只能走一次,而地图可以随意走. 那么可以先处理每个管道间的最短路(不要考虑借助其他 ...