1. 程式人生 > 實用技巧 >Python基礎學習 06-小資料池-深淺拷貝-集合

Python基礎學習 06-小資料池-深淺拷貝-集合

目錄


Day06

小資料池

小資料池 -- 快取機制(駐留機制)
== 判斷等號兩邊的值是否相等
is 判斷兩邊的記憶體地址是否相等

程式碼塊:一個檔案,一個函式,一個類,一個模組,終端中每一行是一個程式碼塊;

數字:
      在同一程式碼塊下,只要內容相等就採用相同的記憶體地址(-5以後就不是)
      數字在做乘法的時候範圍 -5~256
      數字在做乘法的時候不能使用浮點數
字串:
      在同一程式碼塊下,只要內容相同就採用相同的記憶體地址
      乘法的時候總長度不能超過20
      乘法的時候中文,特殊符號乘以1或0
布林值:
      在同一程式碼塊下,只要內容相同就採用相同的記憶體地址


小資料池:
數字: -5~256
字串:
      在同一程式碼塊下,只要內容相同就採用相同的記憶體地址
      乘法的時候總長度不能超過20
      乘法的時候中文,特殊符號乘以0
布林值:
      在同一程式碼塊下,只要內容相同就採用相同的記憶體地址

小資料池的驗證方法:必須脫離程式碼塊才能進行驗證;
先執行程式碼塊的規則,再執行小資料的規則--(駐留機制)

深淺拷貝賦值

賦值

多個變數名指向同一個記憶體地址;
一個變數對其進行操作,其他變數檢視時都變動;

lst = [1,2,3,[5,6,7]]
lst1 = lst
print(lst1)
print(lst)

lst[-1].append(8)
print(lst1)
print(lst)

淺拷貝

淺拷貝的時候只拷貝第一層元素;
淺拷貝在修改第一層元素(不可變資料型別)的時候,拷貝出來的新列表不改變;
淺拷貝在修改第一層元素(可變資料型別)的時候,拷貝出來的新列表不改變;
淺拷貝在修改第一層元素中的元素(第二層)的時候,拷貝出來的新列表改變;

lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
print(lst[-1], id(lst[-1]))
print(lst1[-1], id(lst1[-1]))
# [5, 6, 7] 1932530034632
# [5, 6, 7] 1932530034632

lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst[3] = 567
print(lst1)
print(lst)
# [1, 2, 3, [5, 6, 7]]
# [1, 2, 3, 567]

lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()  #  [1,2,3,4,[5,6,7,[8,9]],10]
lst1.append(10)
print(lst)
print(lst1)
# [1, 2, 3, 4, [5, 6, 7, [8, 9]]]
# [1, 2, 3, 4, [5, 6, 7, [8, 9]], 10]

lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()
lst1[-1][-1] = "56"
print(lst)
print(lst1)
# [1, 2, 3, 4, [5, 6, 7, '56']]
# [1, 2, 3, 4, [5, 6, 7, '56']]

lst = [[1,2,],90,6,7,[5,6]]
lst1 = lst.copy()
lst1[-1] = 8
print(lst)
print(lst1)
# [[1, 2], 90, 6, 7, [5, 6]]
# [[1, 2], 90, 6, 7, 8]

dic = {"xiaoming":[1,2,3,[5,6]]}
dic1 = dic.copy()
dic["xiaoming"][0] = "56"
print(dic)
print(dic1)
# {'xiaoming': ['56', 2, 3, [5, 6]]}
# {'xiaoming': ['56', 2, 3, [5, 6]]}

深拷貝

深拷貝開闢一個容器空間(列表),不可變資料公用,可變資料型別(再次開闢一個新的空間);
空間裡的值是不可變的資料進行公用,可變的資料型別再次開闢空間;

import copy
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst)
lst[-1].append(8)
print(lst)
print(lst1)
# [1, 2, 3, [4, 5, 6, 8]]
# [1, 2, 3, [4, 5, 6]]

lst = [1,2,3,[5,6,7,[8,10,9]]]
import copy
lst1 = copy.deepcopy(lst)
print(id(lst[-1][-1]))
print(id(lst1[-1][-1]))
# 1934118758344
# 1934120008904

集合

集合 set
沒有值的字典,無序,不支援索引,天然去重

定義集合
s = {1, "xiaoming", False, (1,2,3), 123, 123, 1, 123}
print(s)
# {False, 1, (1, 2, 3), 'xiaoming', 123}

將列表去重

lst = [1,2,1,2,1,2,45,22,22,32,23,23,32,222]
print(list(set(lst)))

set = {False, 1, (1, 2, 3), 'xiaoming', 123}
set.add("777")            # 只能新增一個
# {False, 1, 'xiaoming', (1, 2, 3), '777', 123}

set.update("今天是個好日子")      # 迭代新增
print(set)
# {False, 1, '子', '777', '個', '好', '日', '是', (1, 2, 3), 'xiaoming', 123, '天', '今'}

s = {1, 2, 3, 4}
print(s.pop(), s)      # pop有返回值
# 1 {2, 3, 4}
s.remove(3)      # 指定元素刪除
print(s)
{2, 4}
s.clear()      # 清空
set()      # 空集合
print(s)

先刪再加

for i in {1,2,3}:
    print(i)

其他操作

s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7}
print(s1 & s2)      # 交集      {5, 6, 7}
print(s1 | s2)      # 並集      {1, 2, 3, 4, 5, 6, 7}
print(s1 - s2)      # 差集      {1, 2, 3, 4}
print(s1 ^ s2)      # 反交集     {1, 2, 3, 4}
print(s1 > s2)      # 超集(父集)      True
print(s1 < s2)      # 子集      False


print(frozenset(s1))            # 凍結集合,不常用
# frozenset({1, 2, 3, 4, 5, 6, 7})
dic = {frozenset(s1):1}
print(dic)
# {frozenset({1, 2, 3, 4, 5, 6, 7}): 1}