Python第六课 学习笔记
is id ==
- is 判断的是内存地址是否相同
- id 获取的是内存中的地址
- == 比较的是两边的值是否相等
- id 相同,值一定相同
- 值相同,id不一定相同
代码块
- Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。而作为交互方式输入的每个命令都是一个代码块。
- 代码块:我们所有的代码都需要依赖代码块执行。
- 一个文件就是一个代码块。
- 交互式命令下一行就是一个代码块。
两个机制(了解即可,不用深究)
-
同一个代码块下,有一个机制。不同的代码块下,遵循另一个机制。
-
同一个代码块内的缓存机制:字符串驻留机制
- 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
- 使用的对象:int bool str
- 具体细则:所有的数字,bool,几乎所有的字符串。
- 优点:提升性能,节省内存。
-
不同代码块下的缓存机制:小数据池。
-
机制内容:Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
-
使用的对象:int bool str
-
具体细则:-5~256数字,bool,满足一定规则的字符串。
-
优点:提升性能,节省内存。
-
集合(用的比较少)
-
集合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)
-
关系测试
-
用处:数据之间的关系,列表去重。
深浅copy
-
赋值运算
-
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)