垃圾回收机制与编码

垃圾回收机制

  • 垃圾数据
每当我们给一个数据绑定一个变量名时,都在内存空间储存了这个数据
而当我们取消绑定时,这个数据就是一个无用的数据,但却占据着内存空间,我们叫这种数据为垃圾数据
  • 引用计数
1.当一个数据绑定了一个变量名,这个数据的引用计数就是1,当这个数据绑定了两个变量名,这个数据的引用计数就是2
2.当一个数据的引用计数不为0时,表示这个数据还有用,不会被删除
3.当一个数据的引用计数为0时,表示这个数据是垃圾,python会自动帮你自动清除,释放内存空间
  • 标记清除
1.引用计数虽然好用,但也有缺陷,也就是循环引用:

a = [1]  # 值1绑定变量名a,引用计数为1
b = [2]  # 值2绑定变量名b,引用计数为1
a.append(b)  # 在a列表加入列表b,a引用计数为2
b.append(a)  # 在b列表加入列表a,b引用计数为2
del a  # 取消变量名a与列表的绑定,列表引用计数减1
del b  # 取消变量名b与列表的绑定,列表引用计数减1
此时两个列表的的数据都没有绑定变量名,但引用计数却各自是1,这就是循环引用

2.标记清除可以结局循环引用的问题,它会检查程序中产生的全部数据,给循环引用留个记号,然后一起删除
  • 分代回收
1.我们一般将分代回收分为三代:青年代,中年代,老年代。为了减轻垃圾回收的资源损耗,三代的检查时间差异巨大
2.青年代检查很频繁,每隔几秒钟就会粗略的检查一遍程序,将其中的垃圾数据清除
中年代相比起青年代检查频率就低很多了,一般每隔几分钟才会检查一遍程序,删除其中的无用数据
老年代是三代里最慢的,大概一个小时左右才会检查一遍

字符编码简介

1.只有文本文件才有字符编码的概念
2.计算机存取数据依靠的是二进制,也就是说计算机其实只认识01
3.我们之所以可以在计算机上使用各种文字,是因为有一种人类文字与数字的转换关系,这种转换关系有个统一标准>>>:字符编码表

字符编码发展史

  • 起始
1.最初的计算机是美国人发明的,所以美国人一开始只需要计算机识别英文即可,也就是:
ASCII码:内部只记录了英文字符与数字的对应关系
2.英文只要1bytes来存储字符,所有的英文字符加起来不超过127个(2的七次方),但以防出现新的字符所以加了一位以备不时之需(2的八次方)
  • 发展
1.对于非英文国家来说,计算机只认识英文,让他们学习和使用计算机的门槛变高所有开发了一套自己文字的编码
2.如:中国需要让计算机识别中文,开发了一套中文的编码,也就是:
GBK码:内部记录了中文字符、英文字符与数字的对应关系
1bytes存储英文,2bytes起步存储中文(遇到生僻字使用更多字节)

3.还有韩国的Euc_kr码,日本的shift_JIS码等等
  • 兼容
1.各种编程码下的信息之间无法互相解码,所以一种兼容所有文字的编码诞生了:
万国码(unicode):兼容万国字符
2.unicode的优化版本后,utf8英文还是采用1bytes,而其他统一采用3bytes

字符编码

  • 乱码
当你使用不同编码打开文本文件时,就会乱码,换回相同的编码就好了.
  • 编码就是将人类的文字按照指定编码转换成计算机的数字
  • 解码就是将计算机的数字按照指定编码转换成人类的文字
a = '退!退!退!'  # 只有字符串可以参与编码解码
res = a.encode('utf8')  # 将字符串转换为utf8码
print(res, type(res))
# run:b'\xe9\x80\x80\xef\xbc\x81\xe9\x80\x80\xef\xbc\x81\xe9\x80\x80\xef\xbc\x81' <class 'bytes'>
res1 = res.decode('utf8')  # 将utf8码转换回字符串
print(res1)
# run:退!退!退!
  • 解释器
因为pyth2.x版本的默认编码时ASCII码,所以在2.x版本要在文件开头加上coding:utf8,若要定义字符串需要在字符串前面加u

文件简介

  • 文件运行
打开文件时,计算机会将文件数据从硬盘加载到内存
保存文件时,计算机会见数据从内存保存到硬盘
  • 操作文件

通过编写代码可以操作文件

方式1
f = open(文件路径,读写模式,字符编码)
f.close()
方式2
with open(文件路径,读写模式,字符编码) as 变量名:  # 子代码运行结束之后自动调用close()

用这个代码操作文件时需注意,可能存在特殊含义字母,在字符串的前面加字母r即可取消特殊含义

作业1

l1 = ['jason', 'jason', 'kevin', 'oscar', 'kevin', 'tony', 'kevin']
b = {}  # 先准备一个空字典
for i in l1:  # 将l1内数据值依次打印
    b.update({f'{i}': l1.count(f'{i}')})  # 查找数据值在列表中一共出现了多少次,将次数与数据值组成键值对,在新增到字典li
else:  # 循环完后打印
    print(b)

作业2

a = {}  # 设置一个字典
while True:
    print('''
         1添加员工信息
         2修改员工薪资
         3查看指定员工
         4查看所有员工
         5删除员工数据''')
    bb = input('输入指令>>>:')  # 让用户输入功能指令
    if bb == '1':
        id = input('编号>>>:')
        if id not in a:  # 判断id是否已存在
            name = input('姓名>>>:')
            age = input('年龄>>>:')
            Post = input('岗位>>>:')
            set = input('薪资>>>:')  # 输入用户数据
            a[id] = {'name': name, 'age': age, 'Post': Post, 'set': set}  # 不存在则将新用户数据加入字典
            continue
        print('id已存在')
        continue  # id已存在则重新输入
    elif bb == '2':
        id = input('编号>>>:')
        if id in a:  # 判断id是否存在
            a1 = a.pop(id)  # 存在则取出id对应的用户
            set = input('要将薪资该为多少>>>:')  # 输入修改后的薪资
            a1['set'] = set  # 修改薪资
            a[id] = a1  # 将修改后的用户数据放回字典
            continue
        print('id不存在')
        continue  # id不存在则重新输入
    elif bb == '3':
        id = input('编号>>>:')
        if id in a:  # 判断id是否存在
            print(a[id])  # 存在则打印id对应的用户数据
            continue
        print('id不存在')
        continue  # id不存在则重新输入
    elif bb == '4':
        print(a)  # 查看所有用户名
    elif bb == '5':
        id = input('要删除谁啊>>>:')
        if id in a:  # 判断id是否存在
            del a[id]  # 存在删除指定用户名
            continue
        print('id不存在')
        continue  # id不存在则重新输入
posted @   无言以对啊  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示