深浅copy与小数据池

is == id 用法

is # 判断两个内存地址是否相同     
== # 判断等号两边的值是否相同     
= 代表赋值 改变指向

代码块

在python中一个模块,一个函数,一个类,一个文件等都是一个代码块。

同一代码块

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

不同代码块(小数据池)

1.先执行代码块,不符合代码块才会执行小数据
2.代码块:  一个文件,一个模块,一个函数,一个类,终端中每一行都一个代码块
3.小数据池就是Python中一种提高效率的方式,固定数据类型使用同一个内存地址

小数据池讲解 不同代码块的
int 驻留
	-5 ~ 256  *记住
字符串 驻留
    1.字符串在做乘法的时候总长度不能超过20,进行驻留   # 记住
    2.自己定义的字符串 长度不限制 字符串必须(字母,数字.下划线)组成,进行驻留
    3.特殊字符(中文除外)定义1个时候,进行驻留
    4.字符串*1 其实就是赋值
bool值就是True,False

怎么能自己驻留?
需要使用python的内置模块 from sys import intern
# a = intern("@@@@@@"*20)
# b = intern("@@@@@@"*20)
# print(a is b)        # 自己进行驻留

深浅copy

# 浅copy: list dict: 嵌套的可变的数据类型是同一个。
浅拷贝:拷贝目标可变对象(list, dict, set)时,仅为 整体 第一层可变对象分配新的内存地址,第二层(元素)及以上的可变对象沿用之前对象的内存地址,此外**所有层的不可变对象(int, str, bool, tuple)均沿用之前对象的内存地址。

# 深copy: list dict: 嵌套的可变的数据类型不是同一个 。
深拷贝:拷贝目标可变对象(list, dict, set)时,为所有层的可变对象分配新的内存地址,此外所有层的不可变对象(int, str, bool, tuple)均**沿用之前对象的内存地址。

深浅拷贝的规律:
赋值: 两个变量使用的是同一个空间
浅拷贝:修改不可变数据类型,不变动,修改可变数据类型,变动
深拷贝:修改就不变动
赋值运算 =  不是copy 只是改变指向  ID相同
posted @ 2020-02-29 21:03  一起奥利给  阅读(140)  评论(0编辑  收藏  举报