同一個代碼塊下,有一個機制。不一樣的代碼塊下,遵循另外一個機制。python
同一個代碼塊內的緩存機制:字符串駐留機制緩存
不一樣代碼塊下的緩存機制:小數據池。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)
關係測試
用處:數據之間的關係,列表去重。
賦值運算
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)