python基础知识四 小数据池,深浅拷贝,集合+菜中菜
四、小数据池,深浅拷贝,集合+菜中菜
1小数据池 --缓存机制(驻留机制)
'==' 判断两边内容是否相等
'is' 基于内存地址进行判断是否相同
a = 10
b = 10
print(a == b )
#is
print(a is b)
小数据池的数字范围: -5 ~256
a = -5
b = -5
c = -5
print(id(a))
print(id(b))
print(id(c))
#<-5不行
a = -6
b = -6
print(id(a))
print(id(b))
a = 256
b = 256
print(id(a))
print(id(b))
#>256可以,但是不是小数据池,是python的代码块
a = 257
b = 257
print(id(a))
print(id(b))
1.代码块:python自有的属性
1.代码块范围:(3.7以下版本)
支持:一个文件,一个函数,一个类,一个模块,终端的每一行是一个代码块
2.数字:
- 在同一代码块下,只要内容相同,就采用相同的内存地址,(-5以后就不是),
- *数字在做乘法的时候范围-5 ~ 256
- 数字在做乘法的时候不能用浮点数
a = -2.5 * 1
b = -2.5 * 1
print(id(a))
print(id(b))
3.字符串:
在同一代码块下,只要内容相同,就采用相同的内存地址
*做乘法的时候总长度不能超过20(python4.7版本到4096)
乘法的时候中文,特殊符号乘以1或0
a = "alex你好" *2
b = "alex你好" *2
print(id(a))
print(id(b))
4.布尔值:
在同一代码块下,只要内容相同,就采用相同的内存地址
2.小数据池:
1.数字:
范围*-5 ~256
2.字符串:
- 在同一代码块下,只要内容相同,就采用相同的内存地址
- 做乘法的时候总长度不能超过20
- 乘法的时候中文,特殊符号乘以0
3.bool:
在同一代码块下,只要内容相同,就采用相同的内存地址
必会*:
小数据池的验证方法:必须脱离代码块才能验证(在Windows cmd下验证)
python规则:先执行代码块的规则,在执行小数据池的规则 --(驻留机制)
2.深浅拷贝,赋值
面试必问:赋值,浅拷贝,深拷贝
1.浅拷贝 -- 拷贝第一层元素内存地址,修改第一层元素的时候新拷贝的列表不进行改变
2.深拷贝 -- 不可变的数据类型共用,可变数据类型开辟一个新的空间,新的空间中的元素如果是不可变类型也是共用
3.赋值 -- 多个变量名指向同一个内存地址
import copy
v1 = "alex"
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)
print(v1 is v2)#结果:True
print(v1 is v3)#结果:True
v1 = [1,2,3]
v2 = copy.copy(v1)
v3 = copy.deepcopy(v1)
print(v1 is v2)#结果:False
print(v1 is v3)#结果:False
1.赋值:
多个变量名指向同一个内存地址
#1.赋值
lst = [1,2,3,[5,6,7]]
lst1= list2
print(lst)
print(lst1)
#赋值后,一个操作,两个全变,内存地址相同
lst1[-1].append(8)
print(lst)
print(lst1)
print(id(lst),id(lst1))
2.浅拷贝
*浅拷贝的时候,只会开辟一个新的容器列表,其他元素使用的都是源列表中的元素

lst = [1,2,3,[6,5,7]]
lst1 = lst.copy()#新开辟一个空间给lst1
print(lst)
print(lst1)
print(id(lst),id(lst1))#结果:46646536 46647136
#操作1.修改第二层数据,原列表也变
lst1[-1].append(8)
print(lst1)#结果:[1, 2, 3, [6, 5, 7, 8]]
print(lst)#结果:[1, 2, 3, [6, 5, 7, 8]]
#操作2.修改第一层数据,原列表不变
lst = [1,2,3,[5,6,7]]
lst1 = lst.copy()
lst1[3] = 567
print(lst1)#结果:[1, 2, 3, 567]
print(lst)#结果:[1, 2, 3, [6, 5, 7]]
#操作3.修改第三层数据,原列表也变
lst = [1,2,3,4,[5,6,7,[8,9]]]
lst1 = lst.copy()
lst1[-1][-1] = "56"
print(lst)#结果:[1, 2, 3, 4, [5, 6, 7, '56']]
print(lst1) #结果:[1, 2, 3, 4, [5, 6, 7, '56']]
#操作4.注意,字典的值整个就算为第一层数据,里面的任意都不只是第一层数据
dic = {"alex":[1,2,3,[5,6]]}
dic1 = dic.copy()
dic["alex"] = "56"
print(dic)#结果:{'alex': '56'}
print(dic1)#结果:{'alex': [1, 2, 3, [5, 6]]}
dic["alex"][0] = "56"
print(dic)#结果:{'alex': ['56', 2, 3, [5, 6]]}
print(dic1)#结果:{'alex': ['56', 2, 3, [5, 6]]}
浅拷贝总结:
- 浅拷贝只拷贝第一层元素的内存地址
- 浅拷贝在修改第一层数据时,原数据不变
- 浅拷贝在修改非第一层数据时,同时发生改变
3.深拷贝
深拷贝总结:
无论怎样改变新拷贝的数据,原数据都不会改变。
开辟一个容器空间,不可变数据类型(第一层元素)共用同一内存地址,共用值,可变数据类型(非第一层)在开辟一个新空间(新的内存地址),但是里面的值是共用的
import copy
lst = [1,2,3[6,5,7]]
lst1 = copy.deepcopy(lst)
lst1[-1].append(8)
print(lst)
print(lst1)
#修改非第一层数据,原数据不变
lst1[0] = 88
print(lst)
print(lst1)
#修改第一层数据,原数据不变
print(id(lst[0]))#结果:494255688
print(id(lst1[0]))#结果:494255688
#第一层是同一内存地址
print(id(lst[-1]))#结果:43102336
print(id(lst1[-1]))#结果:43321264
#非第一层是不同的内存地址,但是非第一层内层的值内存地址相同。
print(id(lst[-1][0]))#结果:503627400
print(id(lst[-1][0]))#结果:503627400
4.集合 -- set
1.简介:
没有值的字典,无序 - - 不支持索引,
*天然去重
定义:
s = {1,"alex",False,(1,2,3),12,15,1,1,2,12}#列表不可以作为元素
#面试题:
list1 = [1,2,1,21,21,2,1,212,1,1]
print(list(set(list1)))
2.方法
1.增:
- s.add('66'):一次添加一个元素
- s.update("今天"):迭代添加
s = {1,2,3,4}
s.add("67") #只能添加一个
print(s)
s.update("今天")#迭代添加
print(s)
2.删:
- s.pop():随机删除
- s.remove(3):指定元素删除
- s.clear():清空
s = {1,2,3,4}
s.pop()#有返回值,随机删除
print(s)
print(s.pop)
s.remove(3)#指定元素删除
print(s)
s.clear()
print(s)#集合 set()
3.改:
先删再增
4.查:
for 循环
s = {1,2,3,4}
for i in s:
print(i)
菜中菜:各种集合
s1 = {1,2,3,4,5,6,6,7}
s2 = {5,6,7,1,9}
print(s1 & s2) #交集。结果:{1, 5, 6, 7}
print(s1 | s2) #并集,可去重。结果:{1, 2, 3, 4, 5, 6, 7,9}
print(s1 - s2) #差集。结果:{2, 3, 4}
print(s1 ^ s2) #反交集。结果:{2, 3, 4, 9}
print(s1 > s2) #父集(超集)。结果:False
print(s1 < s2) #字迹。结果:False
#冻结集合,很不常用,也没什么用,使此集合不可更改
print(frozenset(s1))#结果:frozenset({1, 2, 3, 4, 5, 6, 7})
dic = {frozenset(s1):1}
print(dic)#结果:{frozenset({1, 2, 3, 4, 5, 6, 7}): 1}
python基础知识四 小数据池,深浅拷贝,集合+菜中菜的更多相关文章
- Python基础知识(六)------小数据池,集合,深浅拷贝
Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : 一个文 ...
- python 小数据池 深浅拷贝 集合
1.小数据池: 1.1代码块: 一个文件,一个函数,一个类,一个模块,终端中每一行 1.1.1 数字: -5 ~ 256 1.1.2 字符串: 乘法时总长度不能超过20 1.1.3 布尔值: 内容相同 ...
- python基础4(小数据池,编码,深浅拷贝)
1.==与is == 比较值是否相等 is比较内存地址是否相同 2.小数据池 为了节省内存,当数据在一个范围里的时候,两个值相同的变量指向的是小数据池里的同一个地址 数字范围:-5 ~ 256 num ...
- Python基础知识(四)
Python基础知识(四) 一丶列表 定义格式: 是一个容器,由 [ ]表示,元素与元素之间用逗号隔开. 如:name=["张三","李四"] 作用: 存储任意 ...
- python笔记2小数据池,深浅copy,文件操作及函数初级
小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...
- python代码块,小数据池,驻留机制深入剖析
一,什么是代码块. 根据官网提示我们可以获知: 根据提示我们从官方文档找到了这样的说法: A Python program is constructed from code blocks. A blo ...
- python代码块和小数据池
id和is 在介绍代码块之前,先介绍两个方法:id和is,来看一段代码 # name = "Rose" # name1 = "Rose" # print(id( ...
- python之路(内存,小数据池,编码等)
代码块: python真正的代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 但是,在python终端交互模式下,每一条代码都是一个代码块 python在同一个代码块中的变量,初始化对象 ...
- python:id与小数据池与编码
一.id与小数据池 id:查的是内存地址 a = 100 b = 100 print(a == b)#比较的数值 print(a is b)#比较的是id print(id(a),id(b))#id相 ...
随机推荐
- UWP开发-在UWP中使用sqlite
原文:UWP开发-在UWP中使用sqlite sqlite是一种轻量级的数据库,对于一些资源紧张又需要数据库的开发非常好用. SQLite 是一个开源的无服务器嵌入式数据库. 这些年来,它已作为面向存 ...
- 程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)
TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDown ...
- UWP 圆角TextBox和PassWord框
最近在做一个UWP项目,登录的用户和密码框需要圆角的,由于UWP的TextBlock 和PasswordBox是没有CornerRadius属性的,于是我就使用了一个Border嵌套在最外层,设置其他 ...
- Delphi 10.2的 更新说明,所有官方资料:新特征和Bugfix列表,所有工具开发说明
TMS东京版控件更新情况http://www.tmssoftware.com/site/radstudio10_2tokyo.asp RAD Studio 10.2 更新说明http://blog.q ...
- Android Java调用Qt写的so库
有时候,我们反编译apk得到一个so库,如果直接使用这个so库的话,必须使用原来so库同样的package名字,才能用.这样人家反编译你的apk,就知道你侵犯了人家的版权.为了达到混淆的目的,我们可以 ...
- YxdIocp包含有支持大并发的TCP服务组件、HTTP服务组件、UDP服务组件、WebSocket服务组件
Delphi Windows IOCP 通讯模型封装,基于DIOCP.YxdIocp包含有支持大并发的TCP服务组件.HTTP服务组件.UDP服务组件.WebSocket服务组件,和TCP.UDP等基 ...
- php一个不错的分页
1.分页源码 <?php class PageView{ /**页码**/ public $pageNo = 1; /**页大小**/ public $pageSize = 20; /**共多少 ...
- play框架之ORM
初次接触play2,采用的ebeans作为ORM框架.网上的资料并不多,总结如下: 数据的查询可以放在model类里,也可以放在controllers里面,我更倾向于后者,感觉数据流比较完整,好理解, ...
- Nginx多种负载均衡策略搭建
背景介绍 上篇介绍了利用Nginx反向代理实现负载均衡,本文详细讲述Nginx下的几种负载均衡策略. 轮询 轮询,顾名思义,就是轮流请求,基于上篇文章的介绍,我们将负载均衡策略聚焦于default.c ...
- kubernetes实战篇之nexus oss服务器部署及基于nexus的docker镜像仓库搭建
系列目录 Nexus oss仓库管理平台搭建 Nexus是一款仓库管理工具,支持Npm,bower,maven,nuget,apt,yum甚至docker,helm等各种仓库,说的通俗以下,就是私服镜 ...