小数据池代码块、深浅拷贝与集合
小数据池和代码块
== id is
a = 10 b = 10 print(a == b) a = "alex" b = "alex" print(a == b)
name = "alex" print(id(name)) # 4327876736
a = 10 b = 10 print(id(a)) # 4304849568 print(id(b)) # 4304849568 print(a is b) # True # 获取的结果是True是因为a和b的内存地址是相同的
代码块简介:
代码块:Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
小数据池:小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等
代码块的缓存机制
前提条件:在同一个代码块内。
机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。
换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新
的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例
子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,
即:id相同。
适用对象: int(float),str,bool。
代码块支持:
- 字符串:
- 定义字符串的时候内容,长度任意内存地址相同。
- 字符串进行乘法的时候总长度 <=20 内存地址相同。
- 中文,特舒符号 乘法的时候只能乘以1或 0
- 数字:
- 相同的数字内存地址相同
- 布尔值:
- 相同的内存地址相同
小数据池
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的
缓存对象。python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创
建对象, 而是使用在字符串驻留池中创建好的对象。其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就
是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的
整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
小数据池的支持数据类型和范围:
小数据支持:
- 字符串:
- 纯字母和数字的时候长度任意,内存地址相同。
- 纯字母和数字乘法总长度 <= 20 内存地址相同。
- 中文和特殊符号乘法的时候只能乘以 0 内存地址相同
- 数字:
- -5 ~ 256
- 布尔值:
- True
- False
当代码块和小数据池两个在一起,先执行代码块
深浅拷贝
赋值
赋值,即为数据存储地址添加标签
lst = [1,2,3,[6,7,8]] lst1 = lst lst.append(9) print(id(lst)) print(id(lst1)) print(lst is lst1) #结果: 2608490166408 2608490166408 True
浅拷贝
浅拷贝就是只拷贝第一层的元素
lst = [1,2,3,[6,7,8]] # lst2 = lst[:] # 浅拷贝 lst2 = lst.copy() lst.append(9) print(lst) print(lst2) #结果: [1, 2, 3, [6, 7, 8], 9] [1, 2, 3, [6, 7, 8]]
lst = [1,2,3,[6,7,8]] lst2 = lst.copy() lst[1] = "22" print(lst) print(lst2) #结果: [1, '22', 3, [6, 7, 8]] [1, 2, 3, [6, 7, 8]]
lst = [1,2,3,[6,7,8]] lst2 = lst.copy() lst[-1].append(9) print(lst) print(lst2) #结果: [1, 2, 3, [6, 7, 8, 9]] [1, 2, 3, [6, 7, 8, 9]]
深拷贝
深拷贝:拷贝过程中遇到可变数据类型重新创建内存地址,直接拷贝最内层元素
import copy lst = [1,2,3,[6,7,8]] lst1 = copy.deepcopy(lst) lst[-1].append(9) print(lst) print(lst1) #结果: [1, 2, 3, [6, 7, 8, 9]] [1, 2, 3, [6, 7, 8]]
赋值、深浅拷贝总结
- 赋值操作本质上是为数据对象添加标签,进行操作后,标记同一内存地址的变量的值均发生改变
- 浅拷贝即为拷贝第一层元素,对外层元素进行操作后,拷贝前后变量的值不相同,对内层元素进行操作后,拷贝前后变量的值均发生改变
- 深拷贝直接拷贝最内存元素,对内外层元素进行操作时,拷贝前后变量的值都不相同
集合(set)
集合:可简单理解为没有值的字典
特性:天生去重
集合操作:
增加元素
.add(元素) .update(元素) 删除元素
.pop() 随机删除 .remove(元素) 指定元素删除 .clear() 清空集合 空集合set() 修改
先删除后添加
查找
set1 = {'alex',1,False} for i in set1: print(i)
其他操作:
& 交集 |并集 ^反交集 -差集 >超集 <子集
frozenset(
) 冻结集合 将可变数据类型变为不可变数据类型
来源:https://www.cnblogs.com/lifangzheng/p/11171114.html