Python深浅copy小数据

无人久伴 提交于 2019-11-27 21:12:30

单词

set
copy

is == id 用法

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

代码块

同一代码块

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

不同代码块(小数据池)

# 先执行代码块,不符合代码块才会执行小数据
# 代码块:  一个文件,一个模块,一个函数,一个类,终端中每一行都一个代码块
# 小数据池就是Python中一种提高效率的方式,固定数据类型使用同一个内存地址
# 小数据池 不同代码块的
# -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)        # 自己进行驻留

集合 增删改查

# 集合就是一个没有值的字典,遵循:唯一,无序,元素要求可哈希(不可变)
# 集合是无序的
# 集合是可变的
# 集合里面有元祖,只有当元组内的所有元素都为不可变类型的时候才可以做集合元素
# 创建set
# s = set("1234")   # 定义方式
s={1,2,3,"123",False,(1,2,3,4,)}
print(s,type(s))

# 增:
# s.update("3456")  # 迭代添加
# s.add("怼怼")
#删:
# s.pop()   #随机删除
# s.clear()    # 清空
# del s        #删除整个集合
# 改:
# 删了,在加
# 查:
# for

# 天然去重   --  唯一  列表去重

# print(s1 - s2)  #差集
# print(s1 | s2)  #并集   (合集)
# print(s1 & s2)  #交集
# print(s1 ^ s2)  #对称差集  -- 反交集
# print(s1 > s2)  # 超集   -- 父集
# print(s1 < s2)  # 子集

# 冻结集合(可变 转换成 不可变)  -- 更不常用
# f_s = frozenset({1,2,3,4,5})
# dic = {f_s:"1"}
# print(dic)

深浅copy

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

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

深浅拷贝的规律:
赋值: 两个变量使用的是同一个空间
浅拷贝:修改不可变数据类型,不变动,修改可变数据类型,变动
深拷贝:修改就不变动
赋值运算 =  不是copy 只是改变指向  ID相同
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!