Python是如何进行内存管理的?
从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
- Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数
引用计数增加的情况
1.一个对象分配一个新名称
2.将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况
1.使用del语句对对象别名显示的销毁
2.引用超出作用域或被重新赋值
sys.getrefcount()函数可以获得对象的当前引用计数。对于不可变数据(如数字或字符串),解释器会在程序的不同部分共享内存,节约内存。
- 垃圾回收
1.当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2.当两个对象a和b互相引用时,del语句可以减少a、b的引用计数,并销毁用于底层对象的名称。然而,由于每个对象都包含一个对其他对象的引用,因此引用计数不会归零,对象也不会销毁。从而导致内存泄露。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除他们。 - 内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1.Pymalloc机制:为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2.Python对所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3.对于Python对象,如整数,浮点数和List,都有独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
什么是lambda函数?
lambda表达式,通常是在需要一个函数,但是不想费神去命名一个函数的场合下使用,也就是指匿名函数。
lambda [arguments]:expression
写出一段代码实现删除一个list里面的重复元素
1.使用set函数。set(list)
2.使用字典函数。
a=[1,2,3,2,3,2,4,5,3,6] b={} b=b.fromkeys(a) c=list(b.keys()) c
</br>
用sort进行排序,从最后一个元素开始判段
```
a=[1,2,4,23,4,5,64,13,4,67,8]
a.sort()
last=a[-1]
for i in range(len(a)-2,-1,-1):
if last==a[i]:
del a[i]
else:
last=a[i]
print(a)
```
Python里面如何拷贝一个对象?(赋值、浅拷贝和深拷贝的区别)
赋值(=):创建了对象的一个新引用,修改其中任何一个变量都会影响到另一个
浅拷贝:创建一个新对象,但它包含的是对原始对象中包含项的引用,如果用引用的方式修改其中一个,另一个也会改变。(完全切片方法、工厂函数list()、copy模块的copy()函数)
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象,修改其中一个,另一个不会改变。(copy模块的deep.deepcopy()函数)
下面代码会输出什么?
```
def f(x,l=[]):
for in range(x):
l.append(i*i)
print l
f(2)
f(3,[3,2,1])
f(3)
```
```
[0,1]
[3,2,1,0,1,4]
[0,1,0,1,4]
```
这两个参数是什么意思:*args,**kwargs
?
如果我们不确定要往函数中传入多少个参数,或者我们想向函数中以列表和元组的形式传参数时,那就要用*args
.
如果我们不知道要往函数中传入多少个关键字参数,或者传入字典的值作为关键字参数时,那就要使用**kwargs
单例模式
1.使用new方法
class Singleton(object):
def __new__(cls,*args,**kw):
if not hasattr(cls,'_instance'):
orig=super(Singleton,cls)
cls._instance=orig.__new__(cls,*args,**kw)
return cls._instance
class MyClass(Singleton):
a=1
2.共享属性
创建实例时把所有实例的dict指向同一个字典,这样他们具有相同的属性和方法。
class Borg(object):
_state={}
def __new__(cls,*args,**kw):
ob=super(Borg,cls).__new__(cls,*args,**kw)
ob.__dict__=cls._state
return ob
class MyClass(Borg):
a=1
3.装饰器
def singleton(cls,*args,**kw):
instances = {}
def getinstance():
if cls not in instances:
instances[cls]=cls(*args,**kw)
return instances[cls]
@singleton
class MyClass:
...
4.import方法
作为Python的模块是天然的单例模式
网友评论