當前位置:
首頁 >
几个必知的python小知识
發布時間:2024/9/3
37
豆豆
生活随笔
收集整理的這篇文章主要介紹了
几个必知的python小知识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1.可變對象 和 不可變對象
- 可變對象
- 不可變對象
- 2. 淺拷貝 和 深拷貝
- 淺拷貝
- 切片操作
- 深拷貝
- 3. == 和 is
- 4. isinstance 和 type
- 5. 垃圾回收 和 內存泄漏
- 垃圾回收
- 內存泄漏
- 6. 函數默認值只執行一次
1.可變對象 和 不可變對象
可變對象
對象內容可修改。
- list
- dict
- set
不可變對象
對象內容不可被修改,所在內存單元被固定好了,變量初始賦值為一個不可變對象,重新對變量賦值 實際上是 變量指向了另一塊內存單元(簡單來說:賦值即引用)。
- str
- tuple
- int,long,float,complex
2. 淺拷貝 和 深拷貝
淺拷貝
淺層的對象被復制一份,內部可變對象的內存單元 未改變,
兩者中可變對象的修改會相互影響。(簡單說就是淺拷貝 只拷貝了引用)
淺拷貝操作:
- [:]
- copy.copy()
切片操作
python 中支持切片操作的對象有:
- str
- tuple
- list
深拷貝
完美拷貝了一份,可變對象被重新創建,可變對象內存單元 變了,兩者修改不影響。
深拷貝操作:
- copy.deepcopy()
3. == 和 is
import copy a = [1,2,3,[4,5]] b = a[:] # 等價于b = copy.copy(a) c = copy.deepcopy(a) a[-1] == b[-1] # True a[-1] is c[-1] # False,等價于id(a[-1]) == id(c[-1])- == 只比較值是否相等
- is 比較所在內存單元是否一樣(是不是同一個東西)
4. isinstance 和 type
- isinstance() 會認為子類是一種父類類型,考慮繼承關系;
- type() 不會認為子類是一種父類類型,不考慮繼承關系;
判斷是否是同類型一般使用isinstance(object, classinfo)
5. 垃圾回收 和 內存泄漏
垃圾回收
基于:
- 引用計數
- 垃圾收集器(可解決循環引用問題)
內存泄漏
可能發生內存泄漏的場景:循環引用。
只有容器對象才會發生循環引用:如class,list,dict,set,deque等
解決方法:
被循環引用的對象不自定義__del__(這種情況,我測試了一下,垃圾自動回收效果不明顯{幾乎沒有!!??},所以還是自己處理比較靠譜。。),若自定義了__del__,在適當的時機解除引用:
使用弱引用模塊weakref中的weakref.proxy()來引用:
import weakref def cycle_ref3():a = A()b = A()a.child = weakref.proxy(b)b.child = weakref.proxy(a)詳見:Python垃圾回收與內存泄露
6. 函數默認值只執行一次
'''函數默認值只會執行一次。這條規則在默認值為可變對象(列表、字典以及大多數類實例)時很重要。 ''' def appendList1(x,L = []):L.append(x)return Ldef appendList2(x,L = None):if L is None:L = []L.append(x)return Lif __name__ =='__main__':print(appendList1(1))print(appendList1(2))print(appendList1(3))print('*'*20)print(appendList2(1))print(appendList2(2))print(appendList2(3))輸出:
[1] [1, 2] [1, 2, 3] ******************** [1] [2] [3]不足之處歡迎批評指正!
總結
以上是生活随笔為你收集整理的几个必知的python小知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python小细节之else
- 下一篇: python三大流程控制