1.内容大纲
- cpu 内存 磁盘 操作系统的关系
- is == id
- 代码块
- 同一代码块的缓存机制
- 不同代码块的缓存机制,小数据池
- 深浅copy
- 经典例题
2.具体内容
1.cpu 内存 磁盘 操作系统的关系
CPU:相当于人类的大脑。中央处理器,运算、计算中心。处理速度非常快,相当于飞机。
磁盘:硬盘,d,e,c等等,相当于计算机的数据库,长期存储大量的数据,文件,图片,片儿等等。断电不消失。加载速度慢,人类的速度。
内存: 16G,32G,等等,断电即消失,临时加载数据。速度相当于高铁。
操作系统: 是计算机中最大(功能)的软件,协调管理计算机的硬件与软件的关系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tVuInXH-1600680156665)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914152713652.png)]****
2.is == id
-
==
比较两边的数值是否相等。
-
id
每个变量指向的数据加载到内存,都会在内存中开辟一个空间,将数据放置到空间,并且给这个空间分配一个唯一的内存地址。id就是获取这个数据的内存地址的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tLENOLEv-1600680156667)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914153234216.png)]
-
is
判断的是左右两边的数据的内存地址是否相同。
3.代码块
Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
而作为交互方式输入的每个命令都是一个代码块。
什么叫交互方式?就是咱们在cmd中进入Python解释器里面,每一行代码都是一个代码块,例如:
而对于一个文件中的两个函数,也分别是两个不同的代码块:
那么,可能有的同学还有一些不理解代码块,可以这样解释:我们都上过学对吧,你们在初中的时候,有没有过值周?就以一个班的学生用一星期的时间打扫整个学校,再比如有没有运动会,无论是值周,还是运动会,还是组织什么活动,都是以什么为单位呢?对,都是以班级为单位,那么咱们学生就好比是代码,班级就好比是代码块,我们想让代码运行起来,必须依靠班级去执行,也就是代码块。
4.同一代码块的缓存机制
适应范围:同一代码块内。
**机制内容:**Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
适用对象:
int: 所有的数字、
str:所有的字符串。
bool 所有的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c020qDHU-1600680156675)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914160546610.png)]
- 节省内存。
- 避免重复创建空间销毁空间,提升性能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGxLvFke-1600680156677)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914161852854.png)]
5.不同代码块的缓存机制
字符串的驻留机制,小数据池,不同代码块的缓存机制。
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pqRaVFZd-1600680156678)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914161331678.png)]
适用对象:
int(float) -5~256
str, 一定规则的字符串
bool True False.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2H1uCRh4-1600680156679)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914161828419.png)]
优点:
- 节省内存。
- 避免重复创建空间销毁空间,提升性能。
小结:
如果在同一代码块下,则采用同一代码块下的换缓存机制。
如果是不同代码块,则采用小数据池的驻留机制。
6.深浅copy
copy,拷贝,赋值。
-
赋值运算
l1 = [11, '太白', [22, 33]] l2 = l1 l1.append(666) # print(l2) print(id(l1)) print(id(l2))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0ZrDF13-1600680156681)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914162641436.png)]
-
浅copy
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdAL8WR9-1600680156682)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914163443059.png)]
# 浅copy # l1 = [11, '太白', [22, 33]] # l2 = l1.copy() # l1.append(666) # # l1[-1].append(666) # print(l2) # print(l1[-1] is l2[-1])
总结:
对于浅copy来说,只是在内存中重新创建了开辟了一个空间存放一个新列表字典,但是新列表中的元素与原列表中的元素是公用的。
-
深copy
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZkjEnTrd-1600680156682)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914164001659.png)]
# 深copy # l1 = [11, '太白', [22, 33]] # l2 = copy.deepcopy(l1) # l1.append(666) # print(l2) # l1[-1].append(666) # print(l2) # print(l1[0] is l2[0]) # l1[0] = 100 # print(l2)
对于深copy来说,列表是在内存中重新创建的,列表中可变的数据类型是重新创建的,列表中的不可变的数据类型是公用的。
-
面试题
# 切片得到的列表是浅copy l1 = [11, '太白', [22, 33]] l2 = l1[:] # print(l1 is l2) # False 他不是赋值运算 l1[-1].append(666) print(l2)
7.经典例题
# 请将列表中的每个元素通过 "_" 链接起来。 # users = ['李少奇','李启航',666,'渣渣辉'] # # res = users[0] # # for i in users[1:]: # # res = res + '_' + str(i) # # print(res) # key_list = [] # value_list = [] # info = {'k1':'v1','k2':'v2','k3':'v3'} # # key_list.extend(info.keys()) # key_list = list(info.keys()) # print(key_list) av_catalog = { "欧美":{ "www.太白.com": ["很多免费的,世界最大的","质量一般"], "www.alex.com": ["很多免费的,也很大","质量挺好"], "oldboy.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "hao222.com":["质量很高,真的很高","全部收费,屌丝请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","verygood"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } # 给此["全部免费,真好,好人一生平安 ","服务器在国外,慢"]列表的第一个元素,加上一句话:'可以爬下来' # av_catalog['大陆']["1024"][0] = av_catalog['大陆']["1024"][0] + '可以爬下来' # av_catalog['大陆']["1024"][0] += '可以爬下来' # 面试题 # 有字符串"k: 1|k1:2|k2:3 |k3 :4" 处理成字典 {'k':1,'k1':2....} # s1 = "k: 1|k1:2|k2:3 |k3 :4" # l1 = s1.split('|') # # print(l1) # ['k: 1', 'k1:2', 'k2:3 ', 'k3 :4'] # dic = {} # for i in l1: # l = i.strip().split(':') # dic[l[0].strip()] = int(l[1]) # print(dic) # s1 = "k: 1|k1:2|k2:3 |k3 :4" # l1 = s1.split('|') # # print(l1) # ['k: 1', 'k1:2', 'k2:3 ', 'k3 :4'] # l2 = [] # for i in l1: # l = i.strip().split(':') # l2.append((l[0].strip(),int(l[1]))) # print(dict(l2))
k2:3 |k3 :4"
l1 = s1.split(’|’)
# print(l1) # [‘k: 1’, ‘k1:2’, 'k2:3 ', ‘k3 :4’]
l2 = []
for i in l1:
l = i.strip().split(’:’)
l2.append((l[0].strip(),int(l[1])))
print(dict(l2))