日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

几个必知的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()
a = [1,2,[3,4]] b = a[:] b[2][0] = 5 print(a) # [1,2,[5,4]] print(b) # [1,2,[5,4]]

切片操作

python 中支持切片操作的對象有:

  • str
  • tuple
  • list

深拷貝

完美拷貝了一份,可變對象被重新創建,可變對象內存單元 變了,兩者修改不影響。

深拷貝操作:

  • copy.deepcopy()
import copy a = a = [1,2,[3,4]] b = copy.deepcopy(a) b[2][0] = 5 print(a) # [1,2,[3,4]] print(b) # [1,2,[5,4]]

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等

class A(object):def __init__(self):self.data = [x for x in range(100000)]self.child = Nonedef __del__(self):passdef cycle_ref1():a = A()b = A()a.child = bb.child = a# 運行后,打開任務管理器可以看到該python程序所占內存飆升 import time while True:time.sleep(0.5)cycle_ref1()

解決方法:
被循環引用的對象不自定義__del__(這種情況,我測試了一下,垃圾自動回收效果不明顯{幾乎沒有!!??},所以還是自己處理比較靠譜。。),若自定義了__del__,在適當的時機解除引用:

def cycle_ref2():a = A()b = A()a.child = bb.child = aa.child = Noneb.child = None

使用弱引用模塊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小知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。