Python是如何進行內(nèi)存管理的?
從三個方面來說秃症,一對象的引用計數(shù)機制琅锻,二垃圾回收機制粤策,三內(nèi)存池機制
- Python內(nèi)部使用引用計數(shù)型奥,來保持追蹤內(nèi)存中的對象,所有對象都有引用計數(shù)
引用計數(shù)增加的情況
1.一個對象分配一個新名稱
2.將其放入一個容器中(如列表倍靡、元組或字典)
引用計數(shù)減少的情況
1.使用del語句對對象別名顯示的銷毀
2.引用超出作用域或被重新賦值
sys.getrefcount()函數(shù)可以獲得對象的當前引用計數(shù)猴伶。對于不可變數(shù)據(jù)(如數(shù)字或字符串),解釋器會在程序的不同部分共享內(nèi)存,節(jié)約內(nèi)存他挎。
- 垃圾回收
1.當一個對象的引用計數(shù)歸零時筝尾,它將被垃圾收集機制處理掉。
2.當兩個對象a和b互相引用時办桨,del語句可以減少a筹淫、b的引用計數(shù),并銷毀用于底層對象的名稱呢撞。然而贸街,由于每個對象都包含一個對其他對象的引用,因此引用計數(shù)不會歸零狸相,對象也不會銷毀。從而導致內(nèi)存泄露捐川。為解決這一問題脓鹃,解釋器會定期執(zhí)行一個循環(huán)檢測器,搜索不可訪問對象的循環(huán)并刪除他們古沥。 - 內(nèi)存池機制
Python提供了對內(nèi)存的垃圾收集機制瘸右,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
1.Pymalloc機制:為了加速Python的執(zhí)行效率岩齿,Python引入了一個內(nèi)存池機制太颤,用于管理對小塊內(nèi)存的申請和釋放。
2.Python對所有小于256個字節(jié)的對象都使用pymalloc實現(xiàn)的分配器盹沈,而大的對象則使用系統(tǒng)的malloc龄章。
3.對于Python對象,如整數(shù)乞封,浮點數(shù)和List做裙,都有獨立的私有內(nèi)存池,對象間不共享他們的內(nèi)存池肃晚。也就是說如果你分配又釋放了大量的整數(shù)锚贱,用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點數(shù)。
什么是lambda函數(shù)关串?
lambda表達式拧廊,通常是在需要一個函數(shù),但是不想費神去命名一個函數(shù)的場合下使用晋修,也就是指匿名函數(shù)吧碾。
lambda [arguments]:expression
寫出一段代碼實現(xiàn)刪除一個list里面的重復元素
1.使用set函數(shù)。set(list)
2.使用字典函數(shù)飞蚓。
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里面如何拷貝一個對象?(賦值、淺拷貝和深拷貝的區(qū)別)
賦值(=):創(chuàng)建了對象的一個新引用溅漾,修改其中任何一個變量都會影響到另一個
淺拷貝:創(chuàng)建一個新對象山叮,但它包含的是對原始對象中包含項的引用,如果用引用的方式修改其中一個添履,另一個也會改變屁倔。(完全切片方法、工廠函數(shù)list()暮胧、copy模塊的copy()函數(shù))
深拷貝:創(chuàng)建一個新的對象锐借,并且遞歸的復制它所包含的對象,修改其中一個往衷,另一個不會改變钞翔。(copy模塊的deep.deepcopy()函數(shù))
下面代碼會輸出什么?
```
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]
```
這兩個參數(shù)是什么意思:*args,**kwargs
席舍?
如果我們不確定要往函數(shù)中傳入多少個參數(shù)布轿,或者我們想向函數(shù)中以列表和元組的形式傳參數(shù)時,那就要用*args
.
如果我們不知道要往函數(shù)中傳入多少個關鍵字參數(shù)来颤,或者傳入字典的值作為關鍵字參數(shù)時汰扭,那就要使用**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.共享屬性
創(chuàng)建實例時把所有實例的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的模塊是天然的單例模式