06 python对象引用、可变性和垃圾回收
python中的变量是什么
python和java中的变量本质不一样,python的变量实质上是一个指针(固定大小)可以指向 int str等,类似于一个便利贴
java的变量类似与一个盒子声明盒子是什么类型,把值存放进去
1 2 | a = 1 a = "abc" |
1 先生成 int 对象1 后,a贴在 这个对象上 a的大小固定指向这个对象
2 先生成 str 对象'abc' 后,a贴在 这个对象上 a的大小固定指向这个对象
==和is的区别
==主要是判断两个对象的值是否相等
is是判断两个对象是否指向的是同一个地址
1 2 3 4 5 6 7 8 9 | a = [ 1 , 2 , 3 , 4 ] b = [ 1 , 2 , 3 , 4 ] # 判断两个对象是否指向同一个地址 print (a is b) print ( type (a) is list ) # 判断两个对象的值是个相等 print (a = = b) |
del语句和垃圾回收
python中的垃圾回收采用的是引用计数机制
创建一个对象进行赋值的时候,引用计数+1,删除一个该对象的引用时引用计数-1,当这个对象的引用计数为0时,回收这个对象
1 2 3 4 | #cpython中垃圾回收的算法是采用 引用计数 a = object () # obj 引用计数+1 b = a # obj 引用计数+1 del a # obj 引用计数-1 |
一个经典的参数错误
如果有一个默认参数是一个可变的类型如list,如果我们使用这个默认的参数不传值覆盖的话,多次使用该方法的时候就会出现共用的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Company: def __init__( self , name, staffs = []): self .name = name self .staffs = staffs def 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" , [ "bobby1" , "bobby2" ]) # 把默认的列表覆盖 com1.add( "bobby3" ) com1.remove( "bobby1" ) print (com1.staffs) com2 = Company( "com2" ) # 使用默认的列表 com2.add( "bobby" ) print (com2.staffs) print (Company.__init__.__defaults__) # 查看一个对象的默认值 com3 = Company( "com3" ) # 使用默认的列表和com2中的列表是同一个 com3.add( "bobby5" ) # com2和com3共用一个staffs print (com2.staffs) print (com3.staffs) print (com2.staffs is com3.staffs) |
输出结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理