内存/深浅copy

1.内容大纲

  1. cpu 内存 磁盘 操作系统的关系
  2. is == id
  3. 代码块
  4. 同一代码块的缓存机制
  5. 不同代码块的缓存机制,小数据池
  6. 深浅copy
  7. 经典例题

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解释器里面,每一行代码都是一个代码块,例如:

img

而对于一个文件中的两个函数,也分别是两个不同的代码块:

img

那么,可能有的同学还有一些不理解代码块,可以这样解释:我们都上过学对吧,你们在初中的时候,有没有过值周?就以一个班的学生用一星期的时间打扫整个学校,再比如有没有运动会,无论是值周,还是运动会,还是组织什么活动,都是以什么为单位呢?对,都是以班级为单位,那么咱们学生就好比是代码,班级就好比是代码块,我们想让代码运行起来,必须依靠班级去执行,也就是代码块。

4.同一代码块的缓存机制

适应范围:同一代码块内。

**机制内容:**Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。

适用对象

​ int: 所有的数字、

​ str:所有的字符串。

​ bool 所有的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c020qDHU-1600680156675)(E:\python+pycharm安装地址\class\2020年9月\0914\day07\image-20200914160546610.png)]

  1. 节省内存。
  2. 避免重复创建空间销毁空间,提升性能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

优点:

  1. 节省内存。
  2. 避免重复创建空间销毁空间,提升性能。

小结:

如果在同一代码块下,则采用同一代码块下的换缓存机制。

如果是不同代码块,则采用小数据池的驻留机制。

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))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值