深浅拷贝,小数据池,代码块

一 深浅拷贝

1. 浅拷贝

lst = [1,2,3,[4,5,6]]
lst1 = lst.copy()   # lst1 = lst[:] 新开辟一块空间
lst[-1].append(8)
print(lst)
print(lst1)

输出结果:

[1, 2, 3, [4, 5, 6, 8]]
[1, 2, 3, [4, 5, 6, 8]]

字典的值是列表,列表里的元素是第二层元素

dic = {'123':[1,2,3,[4,5,6]]}
dic1 = dic.copy()
dic['123'].append(8)
print(dic)
print(dic1)

输出结果:

{'123': [1, 2, 3, [4, 5, 6], 8]}
{'123': [1, 2, 3, [4, 5, 6], 8]}

lst = [1,2,3,[4,5,6]]
lst1 = lst.copy()     #新开辟一块空间
lst[-1] = 8    #  lst.append(8)
print(lst)
print(lst1)

输出结果:

[1, 2, 3, 8] # [1, 2, 3, [4, 5, 6], 8]
[1, 2, 3, [4, 5, 6]] # [1, 2, 3, [4, 5, 6]]

浅拷贝的时候,只会开辟一个新的列表空间,其他元素使用都是原列表的中的元素

浅拷贝在修改新拷贝的列表中可变(不可变)元素的时候,原列表不进行改变

浅拷贝在对新拷贝的列表中可变数据类型进行增删改的时候,原列表进行改变

浅拷贝的时候只拷贝第一层元素

2. 深拷贝

import copy  #导入
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst)
lst[-1].append(8)
print(lst)
print(lst1)

输出结果:

[1, 2, 3, [4, 5, 6, 8]]
[1, 2, 3, [4, 5, 6]]

深拷贝要先开辟一个新的空间(列表),不可变数据公用,可变数据类型再次开辟一个新的空间,空间里的值是不可变数据使用的是公用的,可变数据类型再次开辟一个新的空间

对原数据进行修改,深拷贝的内容不进行改变

二 小数据池 缓存机制(驻留机制)

== 判断两边内容是否相等

is 基于内存地址进行判断

支持的类型:数字,字符串,布尔值

小数据池的数字范围:-5 ~ 256

字符串:在同一个代码块下,只要内容相同就采用相同的内存地址,在做乘法的时候,总长度不能超过20(乘1除外),乘法的时候中文,特殊符号只能乘0,python3.7乘法的时候总长不能超过4096

布尔值:在同一个代码块下,只要内容相同就采用相同的内存地址

小数据池的验证方法,必须脱离代码块才能进行验证

先执行代码块的规则,再执行小数据池的规则 (驻留机制)

三 代码块

一个文件,一个函数,一个类,一个模块,终端中每一行是一个代码块

支持的数据类型:数字,字符串,布尔会

数字:在同一个代码块下,只要内容相同就采用相同的内存地址(-6及以下就不是),数字在做乘法的时候范围:-5 ~ 256,数字在做乘法的时候不能使用浮点数

字符串:在同一个代码块下,只要内容相同就采用相同的内存地址,在做乘法的时候,总长度不能超过20(乘1除外),乘法的时候中文,特殊符号乘1或0

布尔值:在同一个代码块下,只要内容相同就采用相同的内存地址

原文地址:https://www.cnblogs.com/lav3nder/p/11801385.html