python 对象引用、可变性 和 垃圾回收

文章目录

    • 1. 变量是标签
    • 2. 元组的相对不可变性
    • 3. 默认浅复制
    • 4. 函数的参数作为引用时
    • 5. del 和 垃圾回收
    • 6. 弱引用
    • 7. 一些可能的坑!!!

learn from 《流畅的python》

1. 变量是标签

>>> a = [1, 2, 3] 
>>> b = a 
>>> a.append(4) 
>>> b 
[1, 2, 3, 4]

在这里插入图片描述

  • 对象的 id 在生命周期中是不变的
  • is 运算检查两者的 id 是否一致
  • == 检查两者内容(值)是否一样
  • is 运算符比 == 速度快,因为它不能重载,不用寻找并调用特殊方法

2. 元组的相对不可变性

元组的不可变性 其实是指 tuple 数据结构的 物理内容(即保存的引用)不可变,与引用的对象无关

>>> t1 = (1, 2, [30, 40])
>>> t2 = (1, 2, [30, 40])
>>> t1 is t2
False
>>> t1 == t2
True
>>> id(t1[-1])
2633996005896
>>> t1[-1].append(100)
>>> t1
(1, 2, [30, 40, 100])
>>> id(t1[-1])
2633996005896
>>> t1 == t2
False

如果元组内部有 可变对象,那么元组就 不可散列了

3. 默认浅复制

>>> l1 = [3, [55, 44], (7, 8, 9)]
>>> l2 = list(l1) # 创建副本 或者 [:] ,浅复制
>>> l2
[3, [55, 44], (7, 8, 9)]
>>> l1 == l2
True
>>> l1 is l2
False

构造方法[:] 做的是浅复制(即复制了最外层容器,副本中 的元素是源容器中元素的引用)。
如果所有元素都是不可变的,那么这 样没有问题,还能节省内存。
但是,如果有可变的元素,可能就会导致 意想不到的问题。

>>> l1 = [3, [66, 55, 44], (7, 8, 9)]
>>> l2 = list(l1)  # 两者共享内部的 list tuple
>>> l1.append(100)
>>> l1[1].remove(55)
>>> print('l1:', l1)
l1: [3, [66, 44], (7, 8, 9), 100]
>>> print('l2:', l2)
l2: [3, [66, 44], (7, 8, 9)]
>>> l2[1] += [33, 22]   # list 变更,反映到 l1
>>> l2[2] += (10, 11)  # tuple 不可变,+= 生成新的 tuple ,不反映到 l1
>>> print('l1:', l1)
l1: [3, [66, 44, 33, 22], (7, 8, 9), 100]
>>> print('l2:', l2)
l2: [3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]

在这里插入图片描述
在这里插入图片描述

  • copy 模块 的 deepcopy(),copy() 实现 深复制,浅复制

4. 函数的参数作为引用时

  • 可变对象 经过函数修改会传递出来(如果不希望修改原来的,可以创建副本)
  • 不可变对象 操作后,会生成新的对象
  • 不要用 可变对象作为函数默认值,如 def func(a = [])
>>> def func(a=[]):
...     a.append(5)
...     print(a)
...
>>> func()
[5]
>>> func()
[5, 5]
>>> func()
[5, 5, 5]

修改了 可变的默认值,后续调用都会受到影响

5. del 和 垃圾回收

del 语句删除名称,而不是对象
del 命令可能会导致对象被 当作垃圾 回收,但是 仅当 删除的变量 保存的是 对象的最后一个引用,或者无法得 到对象时

6. 弱引用

正是因为有引用,对象才会在内存中存在。

当对象的引用数量归零后, 垃圾回收程序会把对象销毁。

但是,有时需要引用对象,而不让对象 存在的时间超过所需时间。这经常用在缓存中。

弱引用不会增加对象的引用数量
引用的目标对象 称为 所指对象 (referent)。弱引用 不会妨碍 所指对象被当作垃圾回收。
弱引用在缓存应用中很有用,因为我们 不想仅因为 被缓存引用着 而始终 保存缓存对象

7. 一些可能的坑!!!

>>> a = None
>>> b = None
>>> a is b
True
>>> id(a)
140712131987472
>>> id(b)
140712131987472
>>> a = [1,2]
>>> b = [1,2]
>>> a is b
False
>>> a = (1,2)  # list , tuple 相同字面量,id 不同
>>> b = (1,2)
>>> a is b
False
>>> a = "haha"  # 相同的字面量字符串,id 一样!!
>>> b = "haha"
>>> a is b
True
>>> a = 5
>>> b = 5
>>> a is b
True
>>> a, b = 0 , 0
>>> a is b
True
>>> a = 5
>>> a
5
>>> b
0
>>> a = "ha"
>>> b = "ha"
>>> a is b
True
>>> a = "good"  # 但是也无须担心。。
>>> a
'good'
>>> b
'ha'
>>> a = [1,2]
>>> b = a[:]
>>> b
[1, 2]
>>> a is b
False
>>> a = (1,2)
>>> b = a[:]  # 不创建新的副本,而list会创建新的副本
>>> b
(1, 2)
>>> a is b
True
>>> b = tuple(a) # 不创建新的副本,而list会创建新的副本
>>> a is b
True
>>> a = [1,2]
>>> b = list(a) # list 创建副本
>>> b
[1, 2]
>>> a is b
False

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于原型的一点总结

原型(prototype)无疑是JavaScript中一个十分重要的概念,围绕着原型所涉及的原型链继承、内建对象扩展,JS表现出独特的面向对象特性。 1.什么是原型每个JS的函数对象中都有一个默认的prototype属性,它指向的就是这个函数…

python canopen_Python canopener包_程序模块 - PyPI - Python中文网

用于打开文件的python便利函数canopener(filename, moder)。本地文件的行为与open():>>> canopener(local_file.txt)url也可以作为文件名传递并打开进行读取。urllib2.urlopen()是在封面下使用的,因此它具有同等的支持:>>>…

python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片

转载请注明:陈熹 chenx6542foxmail.com (简书号:半为花间酒)若公众号内转载请联系公众号:早起Python本例可以学到的知识点:使用 pdfplumber 提取 PDF 中的文字和表格使用 fitz 提取 PDF 中的图片之前我们已经详细介绍了批量 PDF 文…

天池 在线编程 最长AB子串(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给你一个只由字母’A’和’B’组成的字符串s&#xff0c;找一个最长的子串&#xff0c;要求这个子串里面’A’和’B’的数目相等&#xff0c;输出该子串的长度。 这个子串可以为空。 s的长度n满足 2<n<1000000。示例 样例1 输入: s…

Tomcat 打开一闪而过

转载于:https://www.cnblogs.com/super90/p/4504326.html

java怎么递归_Java的递归、如何与流相结合

递归技术需求&#xff1a;扫描D:\test所有子文件夹及子子文件夹下的.jpg文件。我们如果用循环来做这件事&#xff0c;我们不知道循环的结束条件&#xff0c;也不知道到底有多少层&#xff0c;所以比较麻烦。我们可以用一种新的思想&#xff1a;递归。递归举例&#xff1a;从前有…

假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...

以下完整代码均可从这里获取栈栈的基本概念「后进先出、先进后出就是典型的栈结构」。栈可以理解成一种受了限制的线性表&#xff0c;插入和删除都只能从一端进行当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;就应该首选…

python 自定义类(特殊方法)

文章目录1. 对象表示形式2. 可散列的类3. 私有属性的利弊4. __slots__ 类属性节省空间5. 覆盖类属性learn from 《流畅的python》 from array import array import mathclass Vector2D:typecode d # 类属性def __init__(self, x, y):self.x float(x)self.y float(y)classm…

网络知识

http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html http://www.cnblogs.com/daoluanxiaozi/p/3274925.html转载于:https://www.cnblogs.com/webundle/p/4505782.html

datagridview 动态插入图片_挑战一张照片制作动态PPT背景

在PPT中&#xff0c;要做出好看的页面动画效果&#xff0c;常常需要用很多图片和装饰元素。而如果你手头的素材只有一张照片&#xff0c;如何才能快速做出好看的PPT背景效果呢&#xff1f;本期内容&#xff0c;我们就来一起挑战&#xff0c;使用一张照片&#xff0c;制作PPT动态…

sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换

有时候会有这样的需求&#xff0c;在指定的行后面或者是前面追加一行&#xff0c;这个时候可以使用sed来完成&#xff0c;具体用法如下a\ 在指定的行后面追加一行b\ 在指定的行前面追加一行使用指定的行号追加内容&#xff0c;在使用行号的过程中&#xff0c;需要注意的问题有以…

LeetCode 1941. 检查是否所有字符出现次数相同

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&…

java初学者定远期目标_JAVA题,新手求解

展开全部类图设计&#xff1a;类设计&#xff1a;package car;public class Car {private String id;private String name;public void setId(String id) {this.id id;}public void setName(String name) {this.name name;}/*** 获取汽车编e69da5e6ba9062616964757a686964616…

LeetCode 1942. 最小未被占据椅子的编号(set)

文章目录1. 题目2. 解题1. 题目 有 n 个朋友在举办一个派对&#xff0c;这些朋友从 0 到 n - 1 编号。 派对里有 无数 张椅子&#xff0c;编号为 0 到 infinity 。 当一个朋友到达派对时&#xff0c;他会占据 编号最小 且未被占据的椅子。 比方说&#xff0c;当一个朋友到达时…

python哪本书好看_python入门看哪本书好

推荐几本适合python初学者的书。《Python编程 从入门到实战》本书中涵盖的内容是比较精简的&#xff0c;没有艰深晦涩的概念&#xff0c;最重要的是每个小结都附带有”动手试一试”环节&#xff0c;学编程最佳的方式就是多动手、多动脑。很多初学者看完书之后不知道下一步怎么办…

java mysql geo_GEO数据库简介

为了支持公共使用和散布基因表达数据&#xff0c;NCBI开始了基因表达汇编(GEO)计划。GEO是努力建立一个基因表达数据仓库和在线资源&#xff0c;用于从任何物种或人造的来源检索基因表达数据。来自microarray&#xff0c;高密度寡核苷酸array(HAD)&#xff0c;杂交膜(filter)和…

对每个小组的评论和建议

1、极速蜗牛&#xff1a;总体上已经有了一个小游戏的基本轮廓&#xff0c;虽然还没有达到预期的效果&#xff0c;但是能看到他们的进度。不过这次我们只看到了一直在反弹&#xff0c;对于一个游戏来说&#xff0c;娱乐性是很重要的&#xff0c;但是在这个游戏中我们没有看到很大…

vue路由懒加载_优化vue项目的首屏加载速度

最近使用vue-cli3构建了一个小型的博客系统&#xff0c;完工之后&#xff0c;build打包出来发现一个chunk-vendors包就有1.1m&#xff0c;部署上去之后&#xff0c;访问的时候&#xff0c;首屏加载非常慢。居然需要21s&#xff0c;体验极差。这是打包的结果截图根据这种情况&am…

LeetCode 1943. 描述绘画结果(差分思想)

文章目录1. 题目2. 解题1. 题目 给你一个细长的画&#xff0c;用数轴表示。 这幅画由若干有重叠的线段表示&#xff0c;每个线段有 独一无二 的颜色。 给你二维整数数组 segments &#xff0c;其中 segments[i] [starti, endi, colori] 表示线段为 半开区间 [starti, endi) 且…

java浏览器拖拽_使用Java强制移动浏览器缩小

在我的网络应用中&#xff0c;我有一些缩略图&#xff0c;可在单击时打开一个灯箱。 在移动设备上&#xff0c;缩略图很小&#xff0c;用户通常会放大。问题是&#xff0c;单击播放时&#xff0c;灯箱在可见区域之外(他们必须滚动到灯箱才能观看视频)。 是否可以强制移动浏览器…