深浅拷贝

在Python中使用copy模块用于对象的拷贝操作。

该模块提供了两个主要的方法:浅拷贝 copy.copy()

              深拷贝 copy.deepcopy()

1、浅拷贝(copy)

  • 浅拷贝: 不管是多么复杂的数据结构,浅拷贝只会拷贝第一层.
  • 浅拷贝是对于一个对象的顶层拷贝
  • 通俗的理解是:拷贝了引用,并没有拷贝内容

2、深拷贝(deepcopy)

  • 深拷贝会完全复制原变量的所有数据(递归性质的拷贝),在内存地址中生成一套完全一样的内容,我们对这两个变量中的一个进行任意修改都不会影响另一个变量
import copy
sourceList = [1,2,3,[4,5,6]]
copyList = copy.copy(sourceList)
deepcopyList = copy.deepcopy(sourceList) sourceList[3][0]=100 print(sourceList) # [1, 2, 3, [100, 5, 6]]
print(copyList) # [1, 2, 3, [100, 5, 6]]
print(deepcopyList) # [1, 2, 3, [4, 5, 6]] 浅copy与deepcopy

浅拷贝对不可变类型和可变类型的copy不同

  • copy.copy对于可变类型,会进行浅拷贝

  • copy.copy对于不可变类型,不会拷贝,仅仅是指向

is和==的区别

定义:

  • == 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。
  • is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。
>>> a = [11,22,33]
>>> b = a
>>> a == b
True
>>> a is b
True
>>> c = copy.deepcopy(a)
>>> a == c
True
>>> a is c
False

垃圾回收机制

1、引用计数

 1. 原理

  1)当一个对象的引用被创建或者复制时,对象的引用计数加1;当一个对象的引用被销毁时,对象的引用计数减1.
  2)当对象的引用计数减少为0时,就意味着对象已经再没有被使用了,可以将其内存释放掉。

 2. 优点

  引用计数有一个很大的优点,即实时性,任何内存,一旦没有指向它的引用,就会被立即回收,而其他的垃圾收集技术必须在某种特殊条件下才能进行无效内存的回收。

 3. 缺点

  1)引用计数机制所带来的维护引用计数的额外操作与Python运行中所进行的内存分配和释放,引用赋值的次数是成正比的,
  2)这显然比其它那些垃圾收集技术所带来的额外操作只是与待回收的内存数量有关的效率要低。
  3)同时,因为对象之间相互引用,每个对象的引用都不会为0,所以这些对象所占用的内存始终都不会被释放掉。

2、标记-清除

 1. 说明  

  1)它分为两个阶段:第一阶段是标记阶段,GC会把所有的活动对象打上标记,第二阶段是把那些没有标记的对象非活动对象进行回收。

  2)对象之间通过引用(指针)连在一起,构成一个有向图

  3)从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象。

     根对象就是全局变量、调用栈、寄存器。

 注:像是PyIntObject、PyStringObject这些不可变对象是不可能产生循环引用的,因为它们内部不可能持有其它对象的引用。

            

  1. 在上图中,可以从程序变量直接访问块1,并且可以间接访问块2和3,程序无法访问块4和5
  2. 第一步将标记块1,并记住块2和3以供稍后处理。
  3. 第二步将标记块2,第三步将标记块3,但不记得块2,因为它已被标记。
  4. 扫描阶段将忽略块1,2和3,因为它们已被标记,但会回收块4和5。

 2、缺点

  1)标记清除算法作为Python的辅助垃圾收集技术,主要处理的是一些容器对象,比如list、dict、tuple等

     因为对于字符串、数值对象是不可能造成循环引用问题。

  2)清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。

 3、分代回收

  1. 分代回收是建立在标记清除技术基础之上的,是一种以空间换时间的操作方式。

  2. Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代)

  3. 他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。

  4. 新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发

  5. 把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推

  6. 老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

上下文管理(with语句)

1、什么是with语句

 1. with是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try….except….finlally的处理流程。

 2. 所以使用with处理的对象必须有enter()和exit()这两个方法

  1)with通过enter方法初始化(enter方法在语句体执行之前进入运行)

  2)然后在exit中做善后以及处理异常(exit()方法在语句体执行完毕退出后运行)

2、with语句使用场景

 1. with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源

 2. 比如文件使用后自动关闭、线程中锁的自动获取和释放等。

3、with处理文件操作的实例

with open('/etc/passwd') as f:
for line in f:
print(line)
# 这段代码的作用:打开一个文件,如果一切正常,把文件对象赋值给f,然后用迭代器遍历文件中每一行,当完成时,关闭文件;
# 而无论在这段代码的任何地方,如果发生异常,此时文件仍会被关闭。

python深浅拷贝&垃圾回收&上下文管理(with语句)的更多相关文章

  1. python闭包&深浅拷贝&垃圾回收&with语句

    1. 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数结 ...

  2. Python中深浅拷贝 垃圾回收与 super继承(六)

    1 python拷贝 深拷贝,浅拷贝 与引用三者的区别 import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy ...

  3. Python中的垃圾回收机制

    Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...

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

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

  5. Python中的垃圾回收与del语句

    python中的垃圾回收采用计数算法 一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象. a = 100 b = a del a print(b) print(a) ...

  6. 小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  7. 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝

    一.数据类型分类 二.Python深浅拷贝

  8. python del和垃圾回收

    1. del是删除对象 2. python中的垃圾回收是删除引用计数

  9. 底层剖析Python深浅拷贝

    底层剖析Python深浅拷贝 拷贝的用途 拷贝就是copy,目的在于复制出一份一模一样的数据.使用相同的算法对于产生的数据有多种截然不同的用途时就可以使用copy技术,将copy出的各种副本去做各种不 ...

随机推荐

  1. 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子

    1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...

  2. 安装NSQ

    安装文档 https://nsq.io/deployment/installing.html 打开连接后,根据系统找到对应的二进制包 一般都是linux则下载 https://s3.amazonaws ...

  3. ubuntu 18.04用apt安装mysql-server

    mysql5.7安装完成后普通用户不能进mysql 原因:root的plugin被修改成了auth_socket,用密码登陆的plugin应该是mysql_native_password,直接用roo ...

  4. 蚂蚁金服招聘-无线测试开发(20k-36k/月)

    蚂蚁金服-支付宝国际事业部-高级测试开发工程师/测试专家 工作年限:三年以上学历要求:本科期望层级:P6/P7工作地点:上海,杭州,深圳等为什么选择加入我们? 我们的岗位有何不同?1.国际化远景:随着 ...

  5. 【Hardware】i386、x86和x64的故事

    (1)x86的由来 x86架构首度出现在1978年推出的Intel 8086中央处理器,它是从Intel 8008处理器中发展而来的,而8008则是发展自Intel 4004的.在8086之后,Int ...

  6. Git的安装与TortoiseGit的安装和汉化

    下载Git 进入https://git-scm.com/downloads 可以看到如下界面 因为我是windows系统,选择windows即可. 有的朋友因为网络慢的一些原因不能很快下载下来,可以进 ...

  7. 联想拯救者y7000使用体验

    前言 我以前的电脑是在电商平台买的二手电脑,期间觉得软件的运行速度慢,又在网上买了一个128G的固态硬盘安装上.就从大一到大四上学期这么使用了三年半的时间.因为自己需要运行一些吃内存的软件,而我的这个 ...

  8. Go-数据类型以及变量,常量,函数,包的使用

    Go-数据类型以及变量,常量,函数,包的使用 一.数据类型 1.字符串类型 string -双引号包裹的:"xxx" -反引号包裹,可以换行, 注意: 区别于python,是没有单 ...

  9. file_put_contents生成ansi文件

    $line_body = array('张三','李四','王五'); $line_body = array_map(function ($element){return iconv('UTF-8', ...

  10. 前端每日实战:1# 视频演示如何用纯 CSS 创作一个按钮文字滑动特效

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/zhang-ou/pen/GdpPLE 可交互视频教程 此视频 ...