流畅的python-学习笔记_对象引用、可变性、垃圾回收

变量不是盒子

即变量是引用,而不是实际内存,多个标识赋值相同变量时,多余标识是引用

标识、相等性、别名

==比较对象的值,is比较对象的id。==实际调用对象的__eq__方法。is速度比==快,因为is不能重载,省去了寻找方法的时间

元组不可变性

默认浅复制

即=或copy复制的是容器最浅层的容器元素,嵌套元素复制的是元素引用而非元素本身

深复制用copy.deepcopy即可。深复制可处理循环引用,不会陷入无限循环,但深复制后,调用仍存在循环引用

函数传参

py默认共享传参,也是引用传参,即函数的参数为入参的引用。当入参可变对象时,函数内可能会修改入参对象。若不希望参数被改变,可考虑参数可变性

但不要给默认参数设置可变对象,比如空列表。这会导致实例对该默认参数绑定到类的属性上:ClassName.__init__.___defaults__

del和垃圾回收

Cpython是python的一个解释器,cpython中,垃圾回收机制主要为引用计数,当对象的引用为0时,解释器调用对象的__del__方法。cpython2.0增加了分代垃圾回收算法,可解决循环引用问题

del后如何检测对象是否被删除?可用weakref模块:

发现引用为0立即dead了。del不会明确删除对象,而是删除引用,靠解释器回收机制删除对象

注意 weakref对x也有引用,但对象最后还是被删除了,为啥?因为weakref是弱引用

弱引用

弱引用不会增加对象的引用数量,即不会妨碍回收机制回收对象

不推荐直接用weakref.ref监控对象,可以用WeakKeyDictionary,WeakValueDictionary,finalize或WeakSet

WeakValueDictionary

weakvaluedictionary常用于缓存,他是一种可变map,值是对象弱引用,被引用对象被垃圾回收后,值对应的键会自动删除。weakkeydictionary的键是对象弱引用,和weakvaluedictionary做区分

weakkeydictionary由于key是弱引用,可用来给对象添加附加属性

弱引用局限性

弱引用不可以引用list或dict类型,但可以引用他们的派生类。但int和tuple也不能引用,即使派生类也不能引用,原因是cpython的一些实现细节导致

python对于不可变类型

用对象入参重新创对象,若是不可变类型(比如tuple),会创建对象引用,而非全新对象:

这种现象可称为驻留,是cpython的一种优化措施。

所以比较时,尽量用==而不要用is,否则可能会因为驻留现象受到影响

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

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

相关文章

UNIT6,NFS网络文件系统的应用

实验要求: 1.配置2台服务器要求如下: a)服务器1: 主机名:user-server.timinglee.org ip地址: 172.25.254.100 配置好软件仓库 b)服务器2: 主机名:storage-server.timing…

力扣 300. 最长递增子序列 python AC

动态规划 dp[i]表示到当前位置为止最多个数的递增子序列 简单的对每个位置从头遍历 class Solution:def lengthOfLIS(self, nums):size len(nums)dp [1] * sizefor i in range(1, size):for j in range(i):if nums[i] > nums[j]:dp[i] max(dp[i], dp[j] 1)return max…

数据结构与算法学习笔记之线性表二---顺序表的静态存储表示和实现(C++)

目录 前言 1.什么是顺序表 2.顺序表的静态存储表示 1.初始化 2.长度 3.数据元素 4.长度 5.获取元素下标 6.前驱节点 7.后继节点 8.插入 9.删除 10.遍历 11.测试代码 前言 这篇文章讲的是顺序表的两种实现方式。 1.什么是顺序表 线性表的顺序表示指的是用一组地址…

Double 4 VR情景智能互动教学系统在商务旅行课堂中的应用

一、提高学生的学习兴趣 传统的商务旅行课堂教学方式往往是教师讲授理论知识,学生被动接受。这种方式很难激发学生的学习兴趣,而Double 4 VR情景智能互动教学系统则可以通过虚拟现实技术,将商务旅行的场景生动地展示给学生,让学生…

医院如何做好漏费管理?什么是控费系统?控费系统现在成熟吗?

在中国深厚的人情土壤之中,某些医院里的医技科室,宛如隐秘的灰色地带,悄然滋生着利用职务之便谋取私利的暗流。这些科室的医务人员,以低于医院明文规定的收费标准,私下里为熟识的患者提供检查服务,仿佛形成…

【碎碎念4】向上社交

好久没写碎碎念系列了,最近关注到身边一些社交关系,想要和大家聊聊向上社交这件事情。首先小田认为向上社交或者仅仅是社交本身是无论什么年纪都需要关注的,因为处理好关系不仅仅会帮助我们把握好机会,同时也能让我们更好的建立自…

undolog

undolog回滚段 undolog执行的时间:在执行器操作bufferpool之前。 undolog页

我觉得这个域名证书监控平台又吊打Uptimekuma了

前面我们讲过uptimekuma 如何监控域名证书,很多人都喜欢 uptimekuma 那高端暗黑的色系上,然而最实用就是它的域名证书监控和历史可用性图表的展示上了,如下如: 但是这个东西吧,好看吗?好看,有用…

llama3 发布!大语言模型新选择 | 开源日报 No.251

meta-llama/llama Stars: 53.0k License: NOASSERTION llama 是用于 Llama 模型推理的代码。 提供了预训练和微调的 Llama 语言模型,参数范围从 7B 到 70B。可以通过下载脚本获取模型权重和 tokenizer。支持在本地快速运行推理,并提供不同规格的模型并…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子: 二、代码 对于代码的解释: 1.fit函数: 2.predict函数: 三、实验结果 原因分析: 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类,通过后验概率来判断将新数据归为哪一类。通过利用贝…

MFC的CPen与CBush画图对象使用步骤

在MFC中,CPen和CBrush是两个常用的绘图对象,分别用于定义画笔和画刷,可以用于绘制图形、填充区域等。下面我会详细介绍如何在MFC中使用CPen和CBrush来绘制和填充图形。 使用 CPen 绘制图形: 创建 CPen 对象: 首先&am…

桥梁监控可视化大屏:现代桥梁管理的必备呀。

桥梁监控上可视化有几个重要的原因: 01.实时监控: 可视化的监控系统可以实时显示桥梁的各项监测数据,包括结构变形、振动、温度等,使监控人员能够实时了解桥梁的状态,及时发现异常情况并采取相应的措施。 02.数据分析…

MySQL前缀索引、脏页和干净页、COUNT(*)讨论、表删除内存问题

文章目录 如何加索引如何给身份证号添加索引 SQL语句变慢脏页 (Dirty Pages)干净页 (Clean Pages)为何区分脏页和干净页处理脏页管理策略 flush如何控制 为什么删除表数据后表文件大小不变问题背景核心原因数据存储方式参数影响 解决方案1. 调整innodb_file_per_table设置2. 使…

C#之三目运算、三元运算

三目运算也叫三元运算是一种简单的条件语句,也称为条件运算符。它可以根据一个表达式的结果确定另一个表达式的值。三目运算符使用“?”和“:”来表示。 注意使用bool值进行运算 三目运算符: 套路 三个空位 两个符号 固定写法 : 空位1 ? 空位2 : 空位3; 关键…

2024.5.8 —— LeetCode 高频题复盘

目录 检测循环依赖7. 整数反转LCR 170. 交易逆序对的总数55. 跳跃游戏45. 二叉树的后序遍历50. Pow(x, n)40. 组合总和 II74. 搜索二维矩阵26. 删除有序数组中的重复项61. 旋转链表 检测循环依赖 题目链接 def haveCircularDependency(self, n: int, prerequisites):g [[]for…

MATLAB实现遗传算法优化选址-路径LRP问题(Location-Routing Problem)

MATLAB实现遗传算法优化选址-路径LRP问题(Location-Routing Problem) 一、模型 选址车辆路径问题(Location-Routing Problem, LRP)是一个组合优化问题,旨在同时优化设施位置的选择和车辆的配送路径。在这个问题中,我们考虑一个由…

机器学习 - 决策树

1. 决策树基础 定义与概念 决策树是一种监督学习算法,主要用于分类和回归任务。它通过学习从数据特征到输出标签的映射规则,构建一个树形结构。在分类问题中,决策树的每个叶节点代表一个类别。 案例分析 假设我们有一个关于天气和是否进行…

linux防火墙的操作

linux防火墙的操作 前言1查看防火墙状态2暂时关闭防火墙3永久关闭防火墙4开启防火墙5开启指定端口6关闭指定端口7立即生效8查看开放的端口前言 systemctl是管理linux中服务的命令,可以对服务进行启动、停止、重启、查看状态等操作 firewall-cmd是linux中专门用于控制防火墙的…

并发-守护线程setDaemon()

目录 为什么存在 什么是守护线程 创建守护线程 在使用守护线程时需要注意以下几点 可以使用isDaemon()方法来检查线程是否是守护线程 例1:上面提到当JVM中只剩下守护线程的时候,JVM就会退出,那么写段代码测试下 例2:thread…

小红的字符串构造和小红的排列构造

小红的字符串构造 小红希望你构造一个长度为nnn的、仅包含小写字母的字符串,其中恰好有kkk个长度大于1的回文子串。你能帮帮她吗?输入两个整数n,k,用空格隔开。 1≤n≤10^5,0≤k≤n/2.一个字符串。如果有多解输出任意即可。 可以证明&#x…