Python基础知识(六)------小数据池,集合,深浅拷贝
一丶小数据池
什么是小数据池:
小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址
代码块 :
一个文件, 一个模块, 一个函数 ,一个类,一个终端的每一行就是代码块
代码块的关系:如果在同一个代码块中,默认的整数和字符串还有布尔值都会进行缓存
#在python中是用字典的方式存储 a=1 b=1 print(globals()) #函数会以字典类型返回当前位置的全部全局变量。
讯享网
驻留机制: int ,str ,bool,
讯享网#小数据池只针对: 整数, 字符串, 布尔值. 其他的数据类型不存在驻留机制 # int 范围-5~ 256 # 字符串的规则 1. 长度小于等于1 ,直接缓存 2. 长度大于1, 字符串中只出现,数字,字母,下划线就会缓存 3. 乘以 1,驻留机制同上 . 若乘的数字大于1,仅包含,数字,字母下划线,最终长度小于20就会缓存,超过20就不在缓存 4. 使用sys模块中的 intern() 函数 强制缓存字符串,不论多长都会被缓存 5. 在3.7的版本中,字符串最终驻留长度为4096 #bool 直接会被驻留
is和==和区别
#通过id()我们可以查看到⼀个变量表示的值在内存中的地址. is 比较的是内存地址 == 是比较的值 总结: #如果内存地址相同. 那么值一定是相等的. #如果值相等. 则不一定是同⼀个对象
二丶集合
set集合是python的一个基本数据类型.
特点: 无序,可哈希 ,可变数据类型,可以理解为一个只存放key的字典
主要作用:去重,看最后一条?
讯享网增 s={1,2,3} s.update('adv') # 迭代添加 s.add('1') # 添加一个 print(s) 删除 s.pop() # 随机删 --->在pycharm中,默认删除的是第一个位置上的元素 s.remove(3) # 指定元素删除 s.clear() # 清空集合 del s # 删除整个 集合 print(s) 改 , 就是先删除 ,在添加 s.remove('指定删除') s.add('添加内容') 查 可迭代循环 for i in s: print(i) 其他操作 s1={1,2,3,4} s2={1,2,3,4,5,6} print(s1-s2) # 差集 12 print(s1 | s2) # 合集,并集 print(s1 & s2) # 交集 print(s1 ^ s2) # 反交集 print(s1 >s2) # 超集 print(s1<s2 ) # 子集 冻结集合 (把可变类型转成不可变类型) s=frozenset({1,2,3,1,2,3}) print(type(s)) #frozenset类型 去重, 一行代码实现去重 li=[1,2,3,4,5,1,23,4,2,1,5,6] print(list(set(li))) #结果[1, 2, 3, 4, 5, 6, 23]
三丶深浅拷贝
赋值 (=)
#其实是把内存地址交给变量. 并不是复制一份内容. 所以.lst1的内存指向和lst2是一样的. lst1改变了, lst2也发⽣了改变 lst1=[1,2,3] lst2=lst1 lst1.append('a') print(lst2) print(lst1)

浅拷贝
讯享网 只会拷贝第一层. 第⼆层的内容不会拷贝(这里指的是, 可变的容器型的数据类型如: 列表,字典,集合). 所以被称为浅拷贝 方式一 , 切片 ( 切片属于浅拷贝) lst1=['李四',['a'],'天百','哪吒'] lst2=lst1[:] # 浅拷贝 lst1.append('只存在lst1中') # 原列表添加元素,不影响lst2列表 lst1[1].append('女神') # 可变的数据类型 添加元素 , lst1列表 和lst2列表 都会改变 print(lst1) print(lst2) # lst2和lst1的值相同 , 使用的还是同一个列表.列表内存地址相同 # 浅拷贝 ,只拷贝不是可变的容器类型数据. 可变的容器类型数据共用 print(id(lst1)) # 原列表的 内存值 print(id(lst2)) # 新列表的 内存值 方式二 , copy()方法 是浅拷贝 lst1=['李四',['a'],'天百','哪吒'] lst2=lst1.copy() # 浅拷贝 , 可变的数据类型使用的是相同的内存地址 lst1[1].append('女神') # 在可变的容器类型数据种添加元素. lst1和lst2 都会改变 print(lst1) print(lst2) # 使用id函数 查看可变数据类型的id值是不是相同 print(id(lst1[1])) print(id(lst2[1]))
深拷贝
导入拷贝模块 import copy lst1=['李四',['a'],'天百','哪吒'] lst2=copy.deepcopy(lst1)# 深层拷贝 lst1[1].append('大') # 可变的容器数据类型添加元素, 由于是深拷贝, 可变的容器数据类型也会拷贝一份,产生一个新的. lst1 添加元素, 不影响lst2 print(lst1) # 修改lst1,lst2不受影响 print(lst2) #id()查看原数据种可变的容器类型的数据内存地址,是不一样的 print(id(lst1[1])) print(id(lst2[1]))

深浅拷贝的规律:
赋值: 两个变量使用的是同一个空间
浅拷贝:拷贝变数据类型,直接拷贝, 拷贝可变的容器类型数据时, 容器数据类型不会被拷贝,使用的还是同一个
深拷贝:完完全全的拷贝一份. 可变的容器类型数据,会产生一个新的内存地址
扩展
浅拷贝案例
讯享网li=[] dic={} for index in range(10): # 循环10次 dic['v']=index #由于是可变的容器数据类型. 每次index的值改变,列表和字典的值都会改变 li.append(dic) print(dic,'每次循环的内容',li) print(li)#[{'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}]
图解


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/47453.html