Python全棧-第六課 學習筆記

Python第六課 學習筆記

is id ==

  • is 判斷的是內存地址是否相同
  • id 獲取的是內存中的地址
  • == 比較的是兩邊的值是否相等
  • id 相同,值必定相同
  • 值相同,id不必定相同

代碼塊

  • Python程序是由代碼塊構造的。塊是一個python程序的文本,他是做爲一個單元執行的。代碼塊:一個模塊,一個函數,一個類,一個文件等都是一個代碼塊。而做爲交互方式輸入的每一個命令都是一個代碼塊。
  • 代碼塊:咱們全部的代碼都須要依賴代碼塊執行。
  • 一個文件就是一個代碼塊。
  • 交互式命令下一行就是一個代碼塊。

兩個機制(瞭解便可,不用深究)

  • 同一個代碼塊下,有一個機制。不一樣的代碼塊下,遵循另外一個機制。python

  • 同一個代碼塊內的緩存機制:字符串駐留機制緩存

    • 機制內容:Python在執行同一個代碼塊的初始化對象的命令時,會檢查是否其值是否已經存在,若是存在,會將其重用。換句話說:執行同一個代碼塊時,遇到初始化對象的命令時,他會將初始化的這個變量與值存儲在一個字典中,在遇到新的變量時,會先在字典中查詢記錄,若是有一樣的記錄那麼它會重複使用這個字典中的以前的這個值。因此在你給出的例子中,文件執行時(同一個代碼塊)會把i一、i2兩個變量指向同一個對象,知足緩存機制則他們在內存中只存在一個,即:id相同。
    • 使用的對象:int bool str
    • 具體細則:全部的數字,bool,幾乎全部的字符串。
    • 優勢:提高性能,節省內存。
  • 不一樣代碼塊下的緩存機制:小數據池。app

    • 機制內容:Python自動將-5~256的整數進行了緩存,當你將這些整數賦值給變量時,並不會從新建立對象,而是使用已經建立好的緩存對象。函數

      python會將必定規則的字符串在字符串駐留池中,建立一份,當你將這些字符串賦值給變量時,並不會從新建立對象, 而是使用在字符串駐留池中建立好的對象。性能

        其實,不管是緩存仍是字符串駐留池,都是python作的一個優化,就是將~5-256的整數,和必定規則的字符串,放在一個‘池’(容器,或者字典)中,不管程序中那些變量指向這些範圍內的整數或者字符串,那麼他直接在這個‘池’中引用,言外之意,就是內存中之建立一個。學習

    • 使用的對象:int bool str測試

    • 具體細則:-5~256數字,bool,知足必定規則的字符串。優化

    • 優勢:提高性能,節省內存。code

集合(用的比較少)

  • 集合set:容器型的數據類型,它要求裏面的元素是不可變的數據,但它自己是可變的數據類型。集合是無序的。{2,3}。對象

  • 集合的做用:

    • 列表的去重。
    • 關係測試:交集,並集,差集,.....
  • 集合的建立

  • #方式一(不經常使用)
    set1 = set({1,2,'jarvis',False})
    #方式二(通常使用)
    set1 = {1,2,'jarvis',False}
    #空集合
    set1 = set()
    set1 = {}    	#空字典
  • set1 = {'one','two','three','four','five'}
    #方式一
    set1.add('six')
    #方式二(迭代着增長,分別增長a、b、c)
    set1.update('abc')
  • set1 = {'one','two','three','four','five'}
    #方式一(remove,按照元素去刪除)
    set1.remove('five')
    #方式二(pop,隨機刪除)
    set1.pop()
  • 變相改值(先刪除後增長)

  • set1 = {'one','two','three','four','five'}
    set1.remove('one')
    set1.add('1')
  • 交集運算

  • set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 & set2)
  • 並集運算

  • set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 | set2)
  • 差集運算

  • set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 - set2)
  • 反交集運算

  • set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 ^ set2)
  • 子集

  • set1 = {1,2,3,4,5}
    set2 = {1,2,3,4,5,6,7,8}
    print(set1 < set2)
  • 超集

  • set1 = {1,2,3,4,5}
    set2 = {1,2,3,4,5,6,7,8}
    print(set2 > set1)
  • 列表的去重

  • ll = [1,1,2,2,2,3,3,3,4,5,6,6,6]
    set1 = set(ll)
    ll = list(set1)
    print(ll)
  • 關係測試

  • 用處:數據之間的關係,列表去重。

深淺copy

  • 賦值運算

  • l1 = [1,2,3,[4,5]]
    l2 = l1
    l1.append(6)
    print(l1)
    print(l2)
  • 淺copy(list dict:嵌套的可變的數據類型是同一個)

  • 總結:在內存中開闢一個新的空間存放copy的對象(列表,字典),可是裏面的全部元素與被copy對象的裏面的元素共用一個。

  • l1 = [1,2,3,[4,5]]
    l2 = l1.copy()
    l1.append(6)
    print(l1)
    print(l2)
  • l1 = [1,2,3,[4,5]]
    l2 = l1.copy()
    l1[-1].append(6)
    print(id(l1[-1]))
    print(id(l2[-1]))
  • 深copy(python對深copy作了一個優化,將不可變數據類型沿用同一個。)

  • 總結:深copy則會在內存中開闢新空間,將原列表以及列表裏面的可變的數據類型從新建立一份,不可變數據類型則沿用以前的。

  • import copy
    l1 = [1,2,3,[4,5]]
    l2 = copy.deepcopy(l1)
    l1[-1].append(6)
    print(l1)
    print(l2)
相關文章
相關標籤/搜索