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