【一】深浅拷贝
(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)复制原本的列表会产生的问题
-
新列表是复制出来的副本
-
修改新列表不会影响到原本的列表 -----> 深拷贝
-
修改新列表会影响到原本的列表 -----> 浅拷贝
(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
-
如果修改了源文件的编码格式,造成的后果就是数据找不回来