同一个代码块下,有一个机制。不一样的代码块下,遵循另外一个机制。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)