-
小数据池(python中一种提高效率的方式,固定数据类型使用同一个内存地址)
-
支持str,int,bool
-
id 查看空间的内存地址 获取开辟空间的一种地址 print(id(a))
-
代码块: 一个文件,一个模块,一个函数,一个类,终端中每一行都是一个代码块
在python中是用字典的方式存储
-
is # 判断两个内存地址是否相同 # 必须记住
== # 判断等号两边的值是否相同 # 必须记住 -
字符串:1.字符串在做乘法的时候总长度不能超过20,进行驻留 # 记住
2.自己定义的字符串 长度不限制 字符串必须(字母,数字.下划线)组成,进行驻留
3.特殊字符(中文除外)定义1个时候,进行驻留
4.字符串*1 其实就是赋值 -
如果is判断相同 == 一定相同
如果==判断相同 is 不一定相同a = 1000 b = 1000 print(a == b) a = "alexdsb" * 2 b = "alexdsb" * 2 print(a is b) a ="12345678912345678qwertyuioqwertUIOWERTYUIOQghjksdfghjk____asdgadsfasdfgasdgasdgfsdaf" b ="12345678912345678qwertyuioqwertUIOWERTYUIOQghjksdfghjk____asdgadsfasdfgasdgasdgfsdaf" print(a is b) a = "你" b = "你" print(a is b) # pycharm中是True 因为执行了代码块,终端中是False a = "@" b = "@" print(a is b) a = "你好" b = a * 1 print(a is b) 先执行代码块,不符合代码块才会执行小数据
-
代码块的规则:
数字: 全部驻留
字符串:
1.字符做乘法的时候总长度不能超过20
2.自定定义的都驻留
3.乘数为1的时候 就是赋值
4.python3.7 乘法的时候总长度不能超过4096 -
总结:
小数池 -- 支持: str,int,bool
小数据池数字: -5 ~ 256
小数据池字符串: 乘法时长度不能超过20 -
怎么能自己驻留?
需要使用python的内置模块 from sys import intern a = intern("@@@@@@"*20) b = intern("@@@@@@"*20) print(a is b) # 自己进行驻留
-
小数据在哪用?
1.面试的时候偶尔会用到
2.解决自己的疑惑
-
-
集合( 集合就是一个没有值的字典,遵循:唯一,无序,元素要求可哈希(不可变)------------------------set {1,2,3}
-
s = {1,2,3,"123",False,(1,2,3,4)}
-
集合是无序的
-
集合是可变的
-
集合的增删改
增:
s.update("3456") # 迭代添加 print(s) s.add("怼怼") print(s)
删:
s = {1,2,3,"123",False,(1,2,3,4)} print(s) s.pop() #随机删除 s.remove(3) # 通过元素删除 s.clear() # 清空 del s #删除整个集合 print(s)
改:删了再加
查:
for
天然去重 -- 唯一
其他操作:
s1 = {1,2,3,4,5,6,7} s2 = {3,4,5,6 print(s1 - s2) #差集 print(s1 | s2) #并集 (合集) print(s1 & s2) #交集 print(s1 ^ s2) #对称差集 -- 反交集 print(s1 > s2) # 超集 -- 父集 print(s1 < s2) # 子集
冻结集合(可变 转换成 不可变) -- 更不常用:
f_s = frozenset({1,2,3,4,5}) dic = {f_s:"1"} print(dic)
集合在哪里用
-
去重
li = [1,2,3,4,5,2,2,2,33,3,3,2,2,1,]
print(list(set(li)))] -
面试题:
li = [1,2,3,4,2,1,3] #一行代码去重
print(list(set(li)))
-
-
深浅拷贝(拷贝 -- copy 复制了一份)
l1 = [1,2,3,4,[5,6,7,]] l2 = l1 # 赋值 赋值不是拷贝 l1.append(8) print(l1) print(l2)
- 浅拷贝
l1 = [1,2,3,4,[4,5,6]] l2 = l1[:] # 浅拷贝 l2 = l1.copy() # 浅拷贝 -- 只拷贝第一层 print(id(l1[0])) print(id(l2[0])) 浅拷贝会创建一个新的列表(容器), 新创建的列表中的元素和原列表的元素用的是同一个内存空间 l1 = [1,2,3,4] l2 = l1.copy() print(l1) print(id(l1)) print(id(l2)) print(id(l1[0])) print(id(l2[0])) li = [1,2,32,[3,4,5]] l2 = li.copy() li.append(8) print(l2) print(li) li[-1].append(8) print(l2) l1 = [1,2,3,(1,2,3)] l2 = l1.copy() l2[-1] = 6 print(l1) # 不变 print(l2) # 不变 l1 = [1,2,3,4,[5,6,7,]] l2 = l1.copy() l1[-1].append(8) print(l2) #[1,2,3,4,[5,6,7,8]] li = [1,2,3,4,] l2 = li # 赋值 两个变量指向了一个列表内存地址 li.append(9) print(l2) l1 = [1,2,3,4,5,] l2 = l1.copy() l1.append(8) print(l2) print(l1) l1 = [1,2,3,[4,5,6]] l2 = l1.copy() l2[-1] = 77 print(l1) print(l2)
深拷贝:import copy
深拷贝:import copy li = [1,2,3,4,5,[6,7,8]] l2 = copy.deepcopy(li) print(li) print(id(li)) print(id(li[-1])) print(l2) print(id(l2)) print(id(l2[-1])) 深拷贝 -- 不可变的数据类型和原列表指向同一个空间 可变数据会创建一个新的空间 import copy li = [1,2,3,4,5,[6,7,8]] l2 = copy.deepcopy(li) li[-1].append(678) print(l2) 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)
怎么用,在哪用:
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)
- 1.面试
2.不让修改原数据的时候,使用
-