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

2024-05-02 16:38

本文主要是介绍Python对象引用、可变性和垃圾回收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、Python中的变量是什么

 二、==和is的区别

三、del语句和垃圾回收

四、函数的参数作为引用时

2、不要使用可变类型作为参数的默认值


一、Python中的变量是什么

Python和java中的变量本质不一样。java中的变量是一个盒子,声明时已经说明了盒子的类型,大小。Python的变量实质是一个指针。也可以理解成一个便利贴。可以贴在任何类型上面。

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4) #操作a实际上也就是操作b
>>> b
[1, 2, 3, 4]

 如果把变量想象为盒子, 那么无法解释 Python 中的赋值;应该把变量视作便利贴, 这样就好解释了。先 生成变量,才把便利贴贴上。


为了理解Python中的赋值语句,应该始终先读右边,对象在右边创建或获取,在此之后左边的变量才会绑定到对象上,这就像为对象贴上标注。

 二、==和is的区别

== 运算符比较两个对象的值(对象中保存的数据) , 而 is 比较对象的标识。

a = [1,2,3]
b = a
print (id(a), id(b))
print (a is b)


通常, 我们关注的是值, 而不是标识, 因此 Python 代码中 == 出现的频率比 is 高。然而, 在变量和单例值之间比较时, 应该使用 is。
 

class People:passperson = People()
if type(person) is People:print ("yes")

 

is 运算符比 == 速度快, 因为它不能重载, 所以 Python 不用寻找并调用特殊方法, 而是直接比较两个整数 ID。 而 a == b 是语法糖, 等同于a.__eq__(b)。
 

三、del语句和垃圾回收

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

如果两个对象相互引用, 当它们的引用只存在二者之间时, 垃圾回收程序会判定它们都无法获取, 进而把它们都销毁。
 

在 CPython 中, 垃圾回收使用的主要算法是引用计数。 实际上, 每个对象都会统计有多少引用指向自己。 当引用计数归零时, 对象立即就被销毁: CPython 会在对象上调用 __del__ 方法(如果定义了) , 然后释放分配给对象的内存。 CPython 2.0 增加了分代垃圾回收算法。
 

a = object()
b = a
del a
print(b)
print(a)  #无法输出a对象

四、函数的参数作为引用时

  1. Python 唯一支持的参数传递模式是共享传参(call by sharing) 。 多数面向对象语言都采用这一模式, 包括 Ruby、 Smalltalk 和 Java(Java 的引用类型是这样, 基本类型按值传参) 。
  2. 共享传参指函数的各个形式参数获得实参中各个引用的副本。 也就是说, 函数内部的形参是实参的别名。
  3. 这种方案的结果是, 函数可能会修改作为参数传入的可变对象, 但是无法修改那些对象的标识(即不能把一个对象替换成另一个对象) 。
     
>>> def f(a, b):
... a += b
... return a
...
>>> x = 1
>>> y = 2
>>> f(x, y)
3
>>> x, y 
(1, 2)
>>> a = [1, 2] #可变对象
>>> b = [3, 4]
>>> f(a, b)
[1, 2, 3, 4]
>>> a, b 
([1, 2, 3, 4], [3, 4])
>>> t = (10, 20)
>>> u = (30, 40)
>>> f(t, u)
(10, 20, 30, 40)
>>> t, u 
((10, 20), (30, 40))

2、不要使用可变类型作为参数的默认值

可选参数可以有默认值, 这是 Python 函数定义的一个很棒的特性, 这样我们的 API 在进化的同时能保证向后兼容。 然而, 我们应该避免使用可变的对象作为参数的默认值。

class Company:def __init__(self, name, staffs=[]):self.name = nameself.staffs = staffsdef add(self, staff_name):self.staffs.append(staff_name)def remove(self, staff_name):self.staffs.remove(staff_name)if __name__ == "__main__":com1 = Company("com1", ["tian1", "tian2"])com1.add("tian3")com1.remove("tian1")# print (com1.staffs)com2 = Company("com2")com2.add("tian")# print(com2.staffs)#print (Company.__init__.__defaults__) #(['tian'],)#com3 = Company("com3")com3.add("tian5")print (com2.staffs) #['tian', 'tian5']print (com3.staffs) #['tian', 'tian5']print (com2.staffs is com3.staffs)  #True 问题在于, 没有指定初始员工的 Company实例会共 #享同一个乘客列表# #com2和com3共用一个默认的空list

 

这篇关于Python对象引用、可变性和垃圾回收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954698

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑