深浅拷贝垃圾回收机制四大高阶函数
目錄:
- 淺拷貝和深拷貝
- 垃圾回收機(jī)制
- 高階函數(shù)
淺拷貝和深拷貝
-
淺拷貝: 不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層
-
深拷貝 : 深拷貝會(huì)完全復(fù)制原變量相關(guān)的所有數(shù)據(jù),在內(nèi)存中生成一套完全一樣的內(nèi)容,我們對(duì)這兩個(gè)變量中任意一個(gè)修改都不會(huì)影響其他變量
-
圖例:
-
代碼展示
垃圾回收機(jī)制
引用計(jì)數(shù)
-
原理
1)當(dāng)一個(gè)對(duì)象的引用被創(chuàng)建或者復(fù)制時(shí),對(duì)象的引用計(jì)數(shù)加1;當(dāng)一個(gè)對(duì)象的引用被銷(xiāo)毀時(shí),對(duì)象的引用計(jì)數(shù)減1.
2)當(dāng)對(duì)象的引用計(jì)數(shù)減少為0時(shí),就意味著對(duì)象已經(jīng)再?zèng)]有被使用了,可以將其內(nèi)存釋放掉。 -
優(yōu)點(diǎn)
引用計(jì)數(shù)有一個(gè)很大的優(yōu)點(diǎn),即實(shí)時(shí)性,任何內(nèi)存,一旦沒(méi)有指向它的引用,就會(huì)被立即回收,而其他的垃圾收集技術(shù)必須在某種特殊條件下才能進(jìn)行無(wú)效內(nèi)存的回收。
- 缺點(diǎn)
- 引用計(jì)數(shù)機(jī)制所帶來(lái)的維護(hù)引用計(jì)數(shù)的額外操作與Python運(yùn)行中所進(jìn)行的內(nèi)存分配和釋放,引用賦值的次數(shù)是成正比的,
- 這顯然比其它那些垃圾收集技術(shù)所帶來(lái)的額外操作只是與待回收的內(nèi)存數(shù)量有關(guān)的效率要低。
- 同時(shí),因?yàn)閷?duì)象之間相互引用,每個(gè)對(duì)象的引用都不會(huì)為0,所以這些對(duì)象所占用的內(nèi)存始終都不會(huì)被釋放掉。
標(biāo)記-清除
1.說(shuō)明
1)它分為兩個(gè)階段:第一階段是標(biāo)記階段,GC會(huì)把所有的活動(dòng)對(duì)象打上標(biāo)記,第二階段是把那些沒(méi)有標(biāo)記的對(duì)象非活動(dòng)對(duì)象進(jìn)行回收。
2)對(duì)象之間通過(guò)引用(指針)連在一起,構(gòu)成一個(gè)有向圖
3)從根對(duì)象(root object)出發(fā),沿著有向邊遍歷對(duì)象,可達(dá)的(reachable)對(duì)象標(biāo)記為活動(dòng)對(duì)象,不可達(dá)的對(duì)象就是要被清除的非活動(dòng)對(duì)象
根對(duì)象就是全局變量、調(diào)用棧、寄存器。
注:像是PyIntObject、PyStringObject這些不可變對(duì)象是不可能產(chǎn)生循環(huán)引用的,因?yàn)樗鼈儍?nèi)部不可能持有其它對(duì)象的引用。
2.缺點(diǎn):
1)標(biāo)記清除算法作為Python的輔助垃圾收集技術(shù),主要處理的是一些容器對(duì)象,比如list、dict、tuple等 因?yàn)閷?duì)于字符串、數(shù)值對(duì)象是不可能造成循環(huán)引用問(wèn)題。
2)清除非活動(dòng)的對(duì)象前它必須順序掃描整個(gè)堆內(nèi)存,哪怕只剩下小部分活動(dòng)對(duì)象也要掃描所有對(duì)象。
分代回收
高階函數(shù)
lambda基本使用
lambda函數(shù)基本使用
f = lambda x,y,z:x+y+z print(f(1,2,3)) # 6my_lambda = lambda arg : arg + 1 print(my_lambda(10)) # 11- filter()函數(shù)
可以對(duì)序列做過(guò)濾處理,就是說(shuō)可以使用一個(gè)自定的函數(shù)過(guò)濾一個(gè)序列,把序列的每一項(xiàng)傳到自定義
filter()函數(shù)有兩個(gè)參數(shù):
- 第一個(gè),自定函數(shù)名,必須的
- 第二個(gè),需要過(guò)濾的列,也是必須的
簡(jiǎn)單舉例使用
#利用filter,lambda表達(dá)式,獲取列表中小于33的所有元素 l1= [11,22,33,44,55] a = filter(lambda x: x<33, l1) print(list(a))- Map是對(duì)序列根據(jù)設(shè)定條件進(jìn)行操作后返回他設(shè)置的是操作方法, map使用:第一個(gè)參數(shù)接收一個(gè)函數(shù)名,第二個(gè)參數(shù)接收一個(gè)可迭代對(duì)象
map函數(shù)的簡(jiǎn)單使用
list = [1, 2, 3, 4, 5, 6] def add(num):return num + 1 rs = map(add, lt) print(list(rs)) #運(yùn)行結(jié)果: [2, 3, 4, 5, 6, 7]利用map,lambda表達(dá)式將所有偶數(shù)元素加100
l1= [11,22,33,44,55] ret = map(lambda x:x if x % 2 != 0 else x + 100,l1) print(list(ret)) # 運(yùn)行結(jié)果: [11, 122, 33, 144, 55]總結(jié):filter()和map()函數(shù)區(qū)別:
-
Filter函數(shù)用于對(duì)序列的過(guò)濾操作,過(guò)濾出需要的結(jié)果,一次性返回他的過(guò)濾設(shè)置于的是條件
-
Map函數(shù)是對(duì)序列根據(jù)設(shè)定條件進(jìn)行操作后返回他設(shè)置的是操作方法,無(wú)論怎樣都會(huì)返回結(jié)果
-
reduce函數(shù)
(1) reduce()函數(shù)即為化簡(jiǎn)函數(shù),它的執(zhí)行過(guò)程為:每一次迭代,都將上一次的迭代結(jié)果與下一個(gè)元素一同傳入二元func函數(shù)中去執(zhí)行
(2) 在reduce()函數(shù)中,init是可選的,如果指定,則作為第一次迭代的第一個(gè)元素使用,如果沒(méi)有指定,就取seq中的第一個(gè)元素
使用reduce進(jìn)行求和運(yùn)算
from functools import reduce def f(x, y):return x + yprint(reduce(f, [1, 3, 5, 7, 9])) # 25 # 1、先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4; # 2、再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9; # 3、再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16; # 4、再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25; # 5、由于沒(méi)有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。print( reduce(lambda x, y: x + y, [1, 3, 5, 7, 9]) ) # 25使用reduce將字符串反轉(zhuǎn)
s = 'Hello World' from functools import reduceresult = reduce(lambda x,y:y+x,s) # 1、第一次:x=H,y=e => y+x = eH # 2、第二次:x=l,y=eH => y+x = leH # 3、第三次:x=l,y=leH => y+x = lleH print( result ) # dlroW olleH- sorted函數(shù)
1)sorted和sort區(qū)別
- sort 是應(yīng)用在 list 上的方法,sorted 可以對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。
- sort 是對(duì)已經(jīng)存在的列表進(jìn)行操作,無(wú)返回值,而 sorted 方法返回的是一個(gè)新的 list,而不是在原來(lái)的基礎(chǔ)上進(jìn)行的操作。
2)sorted使用
sorted 語(yǔ)法:sorted(iterable, cmp=None, key=None, reverse=False)
sorted對(duì)列表排序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] print( sorted(students, key=lambda s: s[2], reverse=False) ) # 按年齡排序 # 結(jié)果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]sorted對(duì)字典排序
d = {'k1':1, 'k3': 3, 'k2':2} # d.items() = [('k1', 1), ('k3', 3), ('k2', 2)] a = sorted(d.items(), key=lambda x: x[1]) print(a) # [('k1', 1), ('k2', 2), ('k3', 3)]總結(jié)
以上是生活随笔為你收集整理的深浅拷贝垃圾回收机制四大高阶函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python2和3的区别字符编码格式上下
- 下一篇: Docker基础篇