小數據池和深淺拷貝

小數據池

1.什麼是小數據池

小數據池就是python中一種提升效率的方式html

小數據池支持:str,int,boolpython

ID就是查看空間的內存地址的面試

小數據池數字支持範圍-5~256app

2.小數據池啓用的條件

代碼塊: 一個文件,一個模塊,一個函數,一個類,終端中每一行都一個代碼塊函數

代碼塊在python中是用字典的方式去存儲性能

電腦會先執行代碼塊,不符合的時候纔會執行小數據池code

is 和 == 的區別

  • is 判斷兩個內存地址是否相同
  • ==判斷等號兩邊的值是否相同
  • 若是==相同,is不必定相同

字符駐留機制

字符串駐留定義:在計算機科學中,字符串駐留一種僅保存一份相同且不可變字符串的方法。不一樣的值被存放在字符串駐留池中,即小數據池.
字符串駐留限制:僅包含下劃線(_)、字母和數字的字符串會啓用字符串駐留機制駐留。由於解釋器僅對看起來像python標識符的字符串使用intern()方法,而python標識符正是由下劃線、字母和數字組成。python只會針對整數範圍爲[-5, 256]的整數啓用字符串駐留
字符串駐留機制的優缺點以下:
優勢:可以提升一些字符串處理任務在時間和空間上的性能,
缺點:在建立或駐留字符串時的會花費更多的時間。htm

img

當字符串中沒有特殊字符時(‘abc’),引用指向同一對象,即內存地址相同;對象

當字符串中有特殊字符時(‘-abc’),引用指向不一樣對象,即內存地址不一樣.blog

(字符串乘法)字符串會駐留的狀況:

  • 字符串作乘法的時候(與數字相乘)原字符串總長度不超過20()
  • 本身定義的字符串,長度不限制,但字符串必須由字符/數字/下劃線組成才能進行駐留
  • 特殊字符(除中文外)定義1個時候,必須駐留
  • 乘數爲1的時候就是賦值,默認駐留

python3.7 乘法的時候總長度4096

怎麼能本身駐留

須要使用python的內置模塊

sys.intern() 指定駐留。

from sys import intern

a = intern("hello@")

b = intern("hello@")

print("intern 指定駐留:",b is a)

intern 指定駐留 : True

3.小數據池在哪裏用?

面試的時候偶爾用到

解決本身的疑惑

集合

集合的形式:用大括號括起來,包含多個單獨元素(不包含多個對象)

set {1,2,3}

s = {1,2,3}

  • 存放的是單個元素
  • 自然去重
  • 集合是無序的
  • 集合就是一個沒有值的字典,遵循惟一,元素哈希不可變
  • 集合是可變的

添:

s.update("3456") #迭代添加

s.add("元素") 單純添加

刪:

s.pop() 隨機刪除

s.remove("元素") 經過元素刪除

s.clear() 清空

del s 刪除整個集合

改:

刪了再加

查:

for 循環

去重

li = {1,1,2,3,4,5,6,6,7,7}

print(list(set(li)))

各類集合

差集 s1-s2
並集 s1 | s2
交集 s1 & s2
對稱差集--反交集 s1 ^ s2
print(s1 > s2) 超集 判斷s2是否是s1的子集

凍結集合

可變轉換成不可變

frozenset({1,2,3,4,5})

淺拷貝

淺拷貝會建立一個新的列表,列表中的元素和列表共用一份

淺拷貝會建立一個新的列表(容器)

新建立的列表中的元素和原列表的元素用的是同一個內存空間

淺拷貝:只拷貝第一層

會建立一個新的容器,兩個列表公用一份地址

修改不可變數據類型,不變更,修改可變數據類型,變更

深拷貝 :拷貝了以後,就和以前的拷貝目標沒什麼關係,地址不一樣,修改不變更

  • 賦值: 兩個變量使用的是同一個空間
  • 淺拷貝:修改不可變數據類型,不變更,修改可變數據類型,變更
  • 深拷貝:修改就不變更

不可變數據類型更改後地址發生改變,可變數據類型更改地址不發生改變

數據類型 可變/不可變
整型 int=123 不可變
字符串 str= "123" 不可變
元組 tuple=("123",[1,2,3]) 不可變
列表 list=[1,2,3] 可變
集合 set={1,2,3} 可變
字典 dict={a:1,b:2,c:3} 可變
dic = {}   # "v":4
 li = []    #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
 for i in range(0,5):
     dic["v"] = i
     li.append(dic)
 print(li)
 
 深拷貝:
 import copy
 li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
 l2 = copy.deepcopy(li)
 li[-1]['k'] = "a"
 print(li)
 print(l2)
相關文章
相關標籤/搜索