一、小数据池

== id is

判断两边的值是否一样,例如

a = 10
b = 10
print(a == b) a = "alex"
b = "alex"
print(a == b)

这样就是查看==两边的值是否一样.

id是定义一个变量的时候,内存空间中其实是开辟了一块空间,这个开辟的空间是有号码的

name = "alex"
print(id(name))
# 4327876736

is 也是判断,只不过这次判断的是两边值得内存地址是否相同

a = 10
b = 10
print(id(a))  # 4304849568
print(id(b))  # 4304849568
print(a is b)  # True
# 获取的结果是True是因为a和b的内存地址是相同的

发现一个问题 == 和 is 都是True啊,这个is是判断内存地址是否一样,Python考虑到会经常定义一些值,需要开辟空间和销毁空间,它底层就维护了一个小数据池,这个小数据就是规定一个区间使用的是同一个内存地址,比如小数据池中数字的区间范围是 -5 ~ 256,我们刚刚测试的10在区间内,所以获取到的是相同的内存地址

a = 500
b = 500
print(id(a)) # 4344811120
print(id(b)) # 4344811120
print(a is b) # True

不再区间内,怎么内存地址还是一样的啊。这就要说说python的另一个机制 — 代码块

代码块是防止频繁的开空间降低效率设计的,当定一个变量需要开辟空间的时候,它会先去检测定义的这个值在空间中有没有进行开辟,如果没有开辟就开辟一个空间,如果内存中开辟过就使用同一个。

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

代码块支持:

  • 字符串:

    • 定义字符串的时候内容,长度任意内存地址相同。
    • 字符串进行乘法的时候总长度 <=20 内存地址相同。
    • 中文,特舒符号 乘法的时候只能乘以1或 0
  • 数字:
    • 相同的数字内存地址相同
  • 布尔值:
    • 相同的内存地址相同

这就是为什么在pycharm中测试的时候都是True,终端上测试一下数字的范围

当代码块和小数据池两个在一起,先执行代码块

代码块支持的数据类型和支持怎样的操作,现在来看看小数据池的支持数据类型和范围:

小数据支持:

  • 字符串:

    • 纯字母和数字的时候长度任意,内存地址相同。
    • Python36纯字母和数字乘法总长度 <= 20 内存地址相同。
    • Python37纯字母和数字乘法总长度 <= 4096 内存地址相同。
    • 中文和特殊符号乘法的时候只能乘以 0 内存地址相同
  • 数字:
    • -5 ~ 256
  • 布尔值:
    • True
    • False

小数据池和代码块都是Python内置的,咱们开发的时候不使用,他们统称为驻留机制,有了小数据池和代码块能够提升Python的效率

一.深浅拷贝

赋值就是一个容器有多个标签

lst = [1,2,3,[6,7,8]]

在程序这样写,当成程序执行完这两行的时候,内容空间发生的变化就是下图:

一个列表用两个标签,通过标签lst 找到的和标签lst1找到的是同一个,图中的那些一长串数字就是内存地址,Python中是通过内存地址来查看值

lst1 = lst
lst[-1].append(9)

我们通过lst这个标签找到这个列表然后添加一个9,再通过lst1找到这个列表也就多了一个9 因为lst和lst1都是贴在一个地方

我们再来说说浅拷贝,浅拷贝就是只拷贝第一层的元素

看例子:

lst = [1,2,3,[6,7,8]]
# lst2 = lst[:] # 浅拷贝
lst2 = lst.copy()

图中橙色的是新开辟的空间,浅蓝色的是数字类型,红色的列表类型

这样就是浅拷贝,浅拷贝只把原列表中记录的内存地址拿到一个新开辟的列表中

lst = [1,2,3,[6,7,8]]
lst2 = lst[:]
lst.append(9)

为什么lst1中没有添加,是因为先进行的浅拷贝,浅拷贝把原列表中有的内存地址复制了一份放到新开辟的空间中,后期对原列表添加的内容新列表是不会有的,再看看下边的例子

lst = [1,2,3,[6,7,8]]
lst2 = lst.copy()
lst[1] = "22"

修改成字符串"22" 就是在列表中将以前的内存地址更换成新开辟的空间地址

lst = [1,2,3,[6,7,8]]
lst1 = lst.copy()
lst[-1].append(9)

对里边的列表进行修改,列表本身就是可变的数据类型,通过原列表修改最里层的小列表,小列表进行变化,新开辟的列表里存放就是小列表中的内存地址.在去查看的时候就有变动

深拷贝是怎样的操作

import copy
lst = [1,2,3,[6,7,8,9]]
lst2 = copy.deepcopy(lst)

通过上图可以发现浅拷贝和深拷贝在最后列表的位置内存地址不一样,深拷贝是自己单独开辟了一个新的空间,我们现在修改原列表和新开辟的列表没有任何影响.

通过上面的各种测试,总结以下规律:

  • 赋值:

    • 两个或多个变量名指向同一个内存地址,有一个操作内存地址的值进行改变,其余的变量名在查看的时候都进行更改
  • 浅拷贝:
    • 只拷贝列表中第一层的内存地址,原列表修改了不可变数据类型,新开辟的列表不进行变动,因为只是在原列表中将内存地址进行修改了,新开辟的列表中的内存地址还是用的之前的内存地址
    • 原列表对可变数据类型进行了添加,新开辟的列表中存放就是可变数据类型的地址,在去查看的时候就发现进行更改了
  • 深拷贝:
    • 不管你修改原数据的不可变类型还是可变类型,新开辟的空间中都不会进行改变,因为可变数据类型新开辟了一个空间

一.集合

集合在python中也是一个数据类型,我们只用它自带的特性,其余的操作很少使用

集合在Pyhton中的关键字是set,也是以{}的形式展示 只不过集合是一个没有值得字典,为什么这么说呢??

因为集合中的元素要求是不可变的并且还是唯一的,我们就利用它是唯一来做去重

lst = [1,3,4,112,23,1,3,1,41,12,3,1]
print(set(lst))  # 这样就没有重复的元素出现了,我们在将集合抓换成列表
list(set(lst)) # 这样就把没有重复的集合转成列表了
print(list(set(lst)))

集合是无序,可变的数据类型,说到可变我们就知道集合是能够增加和删除等操作的,我们来看看怎么操作

set集合增删改查

增加

s = {"刘嘉玲", '关之琳', "王祖贤"}
s.add("郑裕玲")
print(s)
s.add("郑裕玲") # 重复的内容不会被添加到set集合中
print(s)
s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤") # 迭代更新
print(s)
s.update(["张曼⽟", "李若彤","李若彤"])
print(s)

删除  

s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
item = s.pop() # 随机弹出⼀个.
print(s)
print(item)
s.remove("关之琳") # 直接删除元素
# s.remove("⻢⻁疼") # 不存在这个元素. 删除会报错
print(s)
s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和
dict区分的.
print(s) # set()

修改

# set集合中的数据没有索引. 也没有办法去定位⼀个元素. 所以没有办法进⾏直接修改.
# 可以采⽤先删除后添加的⽅式来完成修改操作
s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
# 把刘嘉玲改成赵本⼭
s.remove("刘嘉玲")
s.add("赵本⼭")
print(s)

查询  

# set是⼀个可迭代对象. 所以可以进⾏for循环
for el in s:print(el)

常⽤操作  

s1 = {"刘能", "赵四", "⽪⻓⼭"}
s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
# 交集
# 两个集合中的共有元素
print(s1 & s2) # {'⽪⻓⼭'}
print(s1.intersection(s2)) # {'⽪⻓⼭'}
# 并集
print(s1 | s2) # {'刘科⻓', '冯乡⻓', '赵四', '⽪⻓⼭', '刘能'}
print(s1.union(s2)) # {'刘科⻓', '冯乡⻓', '赵四', '⽪⻓⼭', '刘能'}
# 差集
print(s1 - s2) # {'赵四', '刘能'} 得到第⼀个中单独存在的
print(s1.difference(s2)) # {'赵四', '刘能'}
# 反交集
print(s1 ^ s2) # 两个集合中单独存在的数据 {'冯乡⻓', '刘能', '刘科⻓', '赵四'}
print(s1.symmetric_difference(s2)) # {'冯乡⻓', '刘能', '刘科⻓', '赵四'}
s1 = {"刘能", "赵四"}
s2 = {"刘能", "赵四", "⽪⻓⼭"}
# ⼦集
print(s1 < s2) # set1是set2的⼦集吗? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))

set集合本⾝是可以发⽣改变的. 是不可hash的. 我们可以使⽤frozenset来保存数据. frozenset是不可变的. 也就是⼀个可哈希的数据类型

s = frozenset(["赵本⼭", "刘能", "⽪⻓⼭", "长桂"])
dic = {s:'123'} # 可以正常使⽤了
print(dic)

转载于:https://www.cnblogs.com/sundawei7/p/11185698.html

小数据池.深浅拷贝.集合相关推荐

  1. 集合 小数据池 深浅拷贝

    set  集合     列表.元组.字符串去重 集合中的元素必须是可哈希(hash)的,但set本身是不可哈希的可变的(有增删改查).不重复.无序的   创建一个空集合 s = set{} 1.关系型 ...

  2. python拷贝文件函数_python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  3. 21天学通python电子版-小数据池,深浅拷贝,集合+菜中菜

    小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异. 那么到底什么是小数据池?他有什么作用呢? 前提条 ...

  4. dya6小数据池、集合、编码、深浅copy

    一.小知识点: 1.id:测试内容的内存地址 s = 'abc' print(id(s) >>> 2174306953568 2.is:判断内存地址是否相等 s = 'abc' s1 ...

  5. 相识python 之小数据池 集合

    ⼀一. ⼩小数据池 在说⼩小数据池之前. 我们先看⼀一个概念念. 什什么是代码块: 根据提示我们从官⽅方⽂文档找到了了这样的说法: A Python program is constructed fr ...

  6. 小数据池与文件的操作

    目录 一,小数据池和深浅拷贝 二,文件操作 一,小数据池和深浅拷贝 小数据池 小数据池:⼀种数据缓存机制. 也被称为驻留机制. 各⼤编程语⾔中都有类似的东⻄.用于提高效率. 支持的数据类型:str,i ...

  7. python小学生课本剧_小学生都能学会的python(小数据池)

    小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...

  8. 小数据池 is和== 再谈编码

    昨日回顾 上节课内容回顾1. 字典{key:value, key:value.....}成对的保存数据字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的1. 增加:dic[新key] = ...

  9. 【Python21天学习挑战赛】字典 小数据池

    ​ ​ 活动地址:CSDN21天学习挑战赛 ​ 开头一叙: 无论是以后学习需要或者是三年后的工作需要,都需要用到python的工具,也接着这次活动的机会,把python系统的学一遍.跟着大佬,让pyt ...

  10. python代码块-python小数据池,代码块的最详细、深入剖析

    一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是 ...

最新文章

  1. 为什么颜值越来越重要_看脸时代来了吗?为什么这个时代越来越注重颜值?
  2. 【Python】集合类型产生KeyError异常原因及数据去重
  3. 不同DPI下窗体的自适应的有关注意点(转)
  4. jQuery 对象与Dom 对象互转
  5. md5值最大长度_豆长老之比特币-哈希值是什么11月16日分享篇
  6. 跨境电商ERP是什么?
  7. 易语言静态连接器提取_vc98linker修复静态编译
  8. 安卓手机模拟路由器 测试WIFI信道遍历
  9. Android Toast的时长
  10. 关于Euler-Poisson积分的几种解法
  11. 数据归档神器-pt-archiver
  12. Revit二次开发—内建类别BuiltInCategory枚举(中英文对照)
  13. ensp WLAN二层零漫游
  14. 白鹭引擎学习笔记(二)
  15. ROS局部运动规划器Teb/DWA
  16. 负载调整率和交叉调整率
  17. 天地有情尽白发,人间无意了沧桑
  18. 自动焊接机器人的视觉识别系统
  19. Apache 文件解析漏洞SSRF漏洞原理介绍及代码
  20. 一年看完64本书后最大的收获:读书无用

热门文章

  1. 如何把IDEA项目与上传到Git中
  2. java 占位符_Java重要知识点
  3. jtextarea可以让某一行右对齐吗_单元格对齐还在敲空格吗?几个简单小技巧要学会...
  4. 1.2执行更高级的线程任务(Performing More Advanced Thread Tasks)
  5. 23种设计模式(二十)数据结构之迭代器
  6. 第三十八篇 pandas模块
  7. 【转】JAVA错误:The public type *** must be defined in its own file***
  8. Django - 补充目录
  9. 阿里云轻量级服务器上JDK及tomcat部署配置
  10. 使用 IntelliJ IDEA打包Spark应用程序