侧边栏壁纸
博主头像
顾小诺 博主等级

行动起来,活在当下

  • 累计撰写 30 篇文章
  • 累计创建 14 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

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

顾小诺
2024-06-17 / 0 评论 / 1 点赞 / 3 阅读 / 0 字

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

一、python中的变量是什么?

image

二、==和is的区别

在Python中,"=="和"is"有着不同的作用和用法:

用于比较两个对象的值是否相等。当使用 进行比较时,Python会比较两个对象的值是否相同,如果相同则返回True,否则返回False。

"is"用于比较两个对象的身份是否相同,即它们是否指向同一个内存地址。当使用"is"进行比较时,Python会检查两个对象是否是同一个对象,如果是同一个对象则返回True,否则返回False。

因此,"=="用于值比较,而"is"用于身份比较。在实际编程中,应根据具体的需求选择合适的比较方式。

a = [1,2,3,4]
b = a
print(b is a)  #True
print(id(a), id(b))  #1177067728576 1177067728576


aa = [1,2,3,4]
bb = [1,2,3,4]  #直接赋值 相当于新开辟了一块空间,指向bb
print(bb is aa) #False
print(id(aa), id(bb)) #1738636338624 1738636338688

#特例 , 对于字符串和小整数, 底层做了优化, 是可能出现赋值返回Ture 的情况
str_a = "123123123123123"
str_b = "123123123123123"
print(str_b is str_a)  #True
print(id(str_a), id(str_b)) #2120283097200 2120283097200

int_a = 123123123
int_b = 123123123
print(int_b is int_a)  #True
print(id(int_a), id(int_b))  #2064594659792 2064594659792


三、del语句和垃圾回收算法

a = object()
b = a
del a  # a引用的对象引用计数器减1
print(b)
print(a)  #NameError: name 'a' is not defined

Python中的垃圾回收机制主要基于引用计数和循环引用检测来工作。具体来说:

引用计数:Python中的每个对象都有一个引用计数器,用于记录当前对象被引用的次数。当对象被创建时,引用计数为1,每当有新的引用指向该对象时,引用计数加1;当引用失效或对象被删除时,引用计数减1。当引用计数为0时,说明对象不再被使用,Python会立即回收该对象的内存空间。

循环引用检测:除了引用计数外,Python还通过循环引用检测来处理循环引用的情况。循环引用指的是两个或多个对象互相引用,形成一个环状结构,导致它们的引用计数永远不会变为0。Python的垃圾回收机制中有一个循环垃圾收集器,用于检测并清除循环引用的对象,释放它们占用的内存空间。

总的来说,Python的垃圾回收机制通过引用计数和循环引用检测来管理和释放不再使用的对象,确保内存的有效利用和自动回收。

1

评论区