Python使用自动垃圾回收(Garbage Collection)机制来管理内存并自动释放不再使用的对象。下面是Python的垃圾回收机制的基本原理:
引用计数(Reference Counting):
- Python中的垃圾回收机制主要基于引用计数。每个对象都有一个引用计数,用于记录有多少个引用指向该对象。
当引用计数为0时,表示该对象不再被使用,可以被回收。 循环引用: - 如果存在循环引用(即对象之间形成一个循环的引用链),引用计数无法正常工作,导致内存泄漏。
为了解决循环引用的问题,Python使用了其他的垃圾回收机制。 标记-清除(Mark and Sweep): - Python中的垃圾回收机制通过标记-清除算法来处理循环引用的情况。
垃圾回收器会定期启动,并从一组根对象开始,遍历整个对象图,并标记所有可访问的对象。
之后,回收器会清除未被标记的对象,并回收它们占用的内存空间。 分代回收: - 为了进一步提高垃圾回收的效率,Python使用了分代回收(Generational Garbage Collection)机制。
对象被分为不同的代(Generation),根据其存活时间进行分类。一般来说,新创建的对象放在第0代,经过一次或多次垃圾回收仍然存活的对象会被提升到更高的代中。
垃圾回收器会更频繁地检查低代中的对象,而对高代中的对象进行较少的检查,以提高垃圾回收的效率。
需要注意的是,Python的垃圾回收机制是自动进行的,开发者不需要手动管理内存。垃圾回收器会根据需要定期启动,并在合适的时机回收不再使用的对象。这样,开发者可以专注于编写代码,而无需过多关注内存管理的细节。
python 中的字典
dic = {“a”:11,“b”:22}
data = dic.items()
print(data)
for k,v in data:
print(k,v)
遍历字典的时候 不允许修改和添加删除字典里面的内容 ,因为 遍历的是字典的引用地址 在修改后会引起重新遍历 导致遍历的次数有问题
拷贝
python中 浅拷贝 拷贝的是引用地址
深拷贝是拷贝的 复制一份 有新的引用地址 等于是复制了
li = [1,2]
lis = [1,2,li]
lis1 = lis.copy()
lis2 = copy.deepcopy(lis)
li.append(3)
print(lis1) # 改變了
print(lis2) # 未改變