深浅拷贝+垃圾回收机制+字符编码

【一】深浅拷贝

(1)深浅拷贝问题
  • 一个列表 ---->基于这个列表进行更改生成新的列表

方式一:将原本的列表复制一份

  • 添加的值只对只对新列表产生改变

num_list = [1, 2, 3]
num_list_new = [1, 2, 3]
num_list_new.append(4)
print(num_list)             # [1, 2, 3]
print(num_list_new)         # [1, 2, 3, 4]

方式二:用新的变量名指向原来的列表 ---> 连续复制

  • 添加的值对新列表和原来的列表都生效

num_list = [1, 2, 3]
num_list_new = num_list
num_list_new.append(4)
print(num_list_new)         # [1, 2, 3, 4]
print(num_list)             # [1, 2, 3, 4]
(2)复制原本的列表会产生的问题
  • 新列表是复制出来的副本

  1. 修改新列表不会影响到原本的列表 -----> 深拷贝

  2. 修改新列表会影响到原本的列表 -----> 浅拷贝

(3)在代码中实现深浅拷贝
[1] 浅拷贝
  • 必须是修改源数据类型中的可变数据类型才生效

num_list = [1, 2, 3, 4, [1, 2]]
num_list_new = copy.copy(num_list)
num_list_new[4].append(5)
​
print(num_list, id(num_list))           # [1, 2, 3, 4, [1, 2, 5]] 1630014163648
print(num_list_new, id(num_list_new))   # [1, 2, 3, 4, [1, 2, 5]] 1630014166976
[2] 深拷贝
  • 深拷贝会将原来的列表完整的复制一份,修改新的列表后不会影响(改变)原来的列表

num_list = [1, 2, 3, 4, [1, 2]]
num_list_new = copy.deepcopy(num_list)
num_list_new[4].append(5)
​
print(num_list, id(num_list))           # [1, 2, 3, 4, [1, 2]] 2597941430976
print(num_list_new, id(num_list_new))   # [1, 2, 3, 4, [1, 2, 5]] 2597941434304
(4)总结
  • 浅拷贝只是复制顶层对象,没有影响深层的可变数据类型

    • 在复制出的列表中引用的也只是原来列表中的内容

  • 深拷贝复制复制的是整个对象的数据结构,成为了一个独立的新列表

    • 在复制出的列表中引用的是新列表中的内容

【二】垃圾回收机制(CG)

(1)什么是垃圾回收机制
  • 垃圾回收机制是(GC机制)python自带的一种机制

  • 专门用来回收变量值所占的内存空间

(2)堆和栈的概念
  • 栈区:变量名和值内存地址关联的区域

  • 堆区:变量值存放的区域

(3)主要记住三个名词
  • 引用计数为主

    • 变量值被变量名指向的次数

  • 标记清除为辅

    • 当一个变量值被引用的时候,Python自带的垃圾回收机制会定期扫描

    • 如果这个变量值有引用 ----> 不管

    • 如果这个变量值没有引用 ----> 标记

  • 分带回收

    • 新生代 -- > 第一次被扫描,扔到新生代中

    • 青春代 --> 直到达到了新生代扫描阈值,如果还没人指向直接挪到 青春代

    • 老年代 --> 直到达到了青春代扫描阈值,如果还没人指向直接挪到 老年代

    • --->直到达到了老年代扫描阈值,如果还没人指向直接清除 del

【三】字符编码

(1)字符编码史
[1]一家独大
  • 计算机是美国发明的 ---> 美国人用英语 (英文字符)

  • 0 / 1 进行编码很麻烦 ---> 用字符代表一串代码

  • 产生了ASCII码

  • 大写英文字母 A-Z : 65-70

  • 小写英文字母 a-z : 97-122

  • 数字0-9 :48 - 57

[2]诸侯割据
  • 随着计算机的普及各个国家的人都有计算机

  • 各个国家基于ASCII码,扩展各自国家的编码表,导致出现的编码表太多

[3]一统天下
  • 统一意见,开发一个编码表unicode:存在所有语言中的所有字符,与数字的一一对应关系,兼容万国字符

  • 美国人--ascii ---> unicode ----> gbk ---> 中文

  • 日本人--shift-jis ---> unicode ----> gbk ---> 中文

(2)如何进行编码解码
# [1]编码 ---> 将字符转换为二进制数据
name = '蚩梦'
# 指定编码格式 ---> 转换成那种语言的二进制四数据
print(name.encode('utf-8'))         # b'\xe8\x9a\xa9\xe6\xa2\xa6'
# [2]解码 ---> 将二进制数据转换为字符
data = b'\xe8\x9a\xa9\xe6\xa2\xa6'
print(data.decode('utf-8'))         # 蚩梦
(3)UTF-8的诞生
[1] 一开始的保存方法
  • 如果保存到硬盘的是GBK格式二进制,当初用户输入的字符只能是中文或英文

  • 同理如果保存到硬盘的是Shift_JIS格式二进制,当初用户输入的字符只能是日文或英文

  • 如果输入的字符中包含多国字符

  • 多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(GBK格式的二进制)

  • 多国字符—√—>内存(unicode格式的二进制)——X—>硬盘(Shift_JIS格式的二进制)

  • 多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(???格式的二进制)

[2] 解决方法就是使用utf-8
  • 多国字符—√—>内存(unicode格式的二进制)——√—>硬盘(utf-8格式的二进制)

[3] 注意
  • 不要随意修改自己文件的编码格式

  • 默认的编码格式一般都是utf-8

  • 如果修改了源文件的编码格式,造成的后果就是数据找不回来

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值