小数据池 集合 深浅拷贝
一丶小数据池
小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址
代码块 :
一个文件, 一个模块, 一个函数 ,一个类,一个终端的每一行就是代码块
代码块的关系:如果在同一个代码块中,默认的整数和字符串还有布尔值都会进行缓存
#在python中是用字典的方式存储
a=1
b=1
print(globals()) #函数会以字典类型返回当前位置的全部全局变量。
驻留机制: int ,str ,bool,
#小数据池只针对: 整数, 字符串, 布尔值. 其他的数据类型不存在驻留机制
# int
范围-5~ 256
# 字符串的规则
1. 长度小于等于1 ,直接缓存
2. 长度大于1, 字符串中只出现,数字,字母,下划线就会缓存
3. 乘以 1,同上,乘的数字大于1,仅包含,数字,字母下划线,最终长度小于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'],'天百','哪吒']
#lst[1]-->是列表,可变的数据类型,不会被拷贝,只拷贝不可变的数据类型.
lst2=['金大王','银王']
lst2=lst1[:] # 浅拷贝
lst1[1].append('女神')
print(lst2) # lst2和lst1的值相同
###方式二
lst1=['李四',['a'],'天百','哪吒']
#lst[1]-->是列表,可变的数据类型,不会被拷贝,只拷贝不可变的数据类型.
lst2=['金大王','银王']
lst2.copy(lst1) # 浅拷贝
lst1[1].append('女神')
print(lst2) # lst2和lst1的值相同
# id()去查看两个不可变类型的数据,引用的同一个.内存地址相同
print(id(lst1[0])) #
print(id(lst2[0])) #
#id()去查看列表内存地址,内存地址一样. 浅拷贝创建了一个新的地址空间
print(id(lst1))
print(id(lst2))
深拷贝
##导入拷贝模块
import copy
lst1=['李四',['a'],'天百','哪吒']
lst2=copy.deepcopy(lst1)# 深层拷贝
lst1[1].append('大')
print(lst1) # 修改lst1,lst2不受影响
print(lst2)
#id()查看原数据种可变的类型的数据的内存地址,是不一样的
print(id(lst1[1]))
print(id(lst2[1]))
深浅拷贝的规律:
赋值: 两个变量使用的是同一个空间
浅拷贝:修改不可变数据类型,不变动,修改可变数据类型,变动
深拷贝:修改就不变动
扩展
li=[]
dic={}
for index in range(10):
dic['v']=index
li.append(dic)
print(li)#[{'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}, {'v': 9}]
浙公网安备 33010602011771号