python 06 深浅拷贝
1. 小数据池
小数据池——缓存机制(驻留机制)
数字的范围为:-5~256(在此范围内的数字,内存地址相同)
1.1 代码块
一个文件,一个函数,一个类,一个模块,终端中每一个行是一个代码块。
支持的数据类型:
数字类型:
在同一代码块下 只要内容相同就采用相同的内存地址(-5 ~ 正无穷大);
数字在做乘法的时候范围 -5 ~ 256;
数字在做乘法的时候不能使用浮点数,否则地址不同。
- 字符串类型:
在同一代码块下 只要内容相同就采用相同的内存地址;
乘法的时候总长度不能超过20,内存地址相同;
乘法的时候中文,特殊符号乘以1或0,内存地址相同。
- 布尔值:
在同一代码块下 只要内容相同就采用相同的内存地址。
1.2 小数据池
支持的数据类型:
数字类型:
数字范围 -5 ~ 256;
字符串类型:
纯字母、数字任意长度,只要内容相同就采用相同的内存地址;
只有乘法的时候总长度不能超过20,内存地址相同;
乘法的时候中文,特殊符号乘以0,内存地址相同。
- 布尔值:
只要内容相同就采用相同的内存地址。
1.3 执行顺序 (代码块--小数据池)
小数据池的验证方法,必须脱离代码块才能进行验证。否则会先执行代码块的规则,再执行小数据池的验证规则。
1.4 "=="和 “is”
"== 判断等号两边值是否相等
"is" 判断两边的值内存地址是否相等
2. 深浅拷贝
2.1 赋值
多个变量名指向同一个内存地址
一个变量对其进行操作,其他变量查看时都变动
lst = [1,2,3,[4,5,6]]
lst1 = lst
print(lst1)
print(lst)
lst[-1].append(8)
print(lst1) # lst、lst1都改变
print(lst)
2.2 浅拷贝: copy()
2.2.1 本质
浅拷贝的时候,只会开辟一个新的容器列表(内存空间),使用的都是源列表中的元素。
lst1 = lst.copy()
print(lst[-1]) # [4,5,6]
print(lst1[-1]) # [4,5,6]
print(id(lst[-1])) # id 内存地址也一样
print(id(lst1[-1]))
2.2.2 特征
lst[ : ] -- 也是浅拷贝;
浅拷贝只拷贝第一层元素;
修改第一层元素时,新开辟了内存空间,则不会进行改变;修改第二层及以上元素时,会改变。
lst = [1,2,3,[4,5,6]]
lst1 = lst.copy() #浅拷贝
lst[0]=10
print(lst) # 会变[10, 2, 3, [4, 5, 6]]
print(lst1) # 不会变[1, 2, 3, [4, 5, 6]]
# 总结:当改变第一层元素(不可变数据类型)时,拷贝出来的新列表不会改变
lst = [1,2,3,[4,5,6]]
lst1 = lst.copy()
lst[-1]=4
print(lst) # 会变 [1, 2, 3, 4]
print(lst1) # 不会变[1, 2, 3, [4, 5, 6]]
# 总结:当改变第一层元素(可变数据类型)时,拷贝出来的新列表不会改变
lst = [1,2,3,[4,5,6]]
lst1 = lst.copy()
lst[-1][-1]=10
print(lst) # 会变[1, 2, 3, [4, 5, 10]]
print(lst1) # 会变[1, 2, 3, [4, 5, 10]]
#总结:当修改(增删改)第一层元素中可变数据类型(第二层元素)时,拷贝出来的新列表会改变,两个列表相同
dic = {"alex":[1,2,3,[4,5,6]]}
dic1 = dic.copy()
dic["alex"].append (0)
print(dic) #{'alex': [1, 2, 3, [4, 5, 6], 0]}
print(dic1) #{'alex': [1, 2, 3, [4, 5, 6], 0]}
#总结:字典存在的值就是第二层元素
dic = {"alex":[1,2,3,[5,6]]}
dic1 = dic.copy()
dic["wusir"]=[7,8] #增加新的键值对
# dic["alex"]=[7,8] #替换键值对的整体值
print(dic) # {'alex': [1, 2, 3, [5, 6]], 'wusir': [7, 8]}
print(dic1) # {'alex': [1, 2, 3, [5, 6]]}
#总结:如果是新增/减键值对或者是替换键值对的整体值,那就是在改第一层元素,不会改变
2.3 深拷贝:copy.deepcopy()
2.3.1 格式
import copy #导入
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst) # 深拷贝
print(lst)
print(lst1)
2.3.2 特征
不可变的数据类型共用,可变的数据类型重新开辟一个空间对源数据进行修改; 深拷贝的内容都不会改变。
import copy
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst)
lst[-1][-1] = 10
print(lst) #会变[1, 2, 3, [4, 5, 10]]
print(lst1) #不变[1, 2, 3, [4, 5, 6]]
import copy
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst)
lst[-1].append(7)
print(lst) #会变[1, 2, 3, [4, 5, 6, 7]]
print(lst1) #不变[1, 2, 3, [4, 5, 6]]
#总结:深拷贝对第二层元素改变时,拷贝出来的新列表不会改变
import copy
lst = [1,2,3,[4,5,6]]
lst1 = copy.deepcopy(lst)
lst[-1] = 10
print(lst) #会变[1, 2, 3, 10]
print(lst1) #不变[1, 2, 3, [4, 5, 6]]
#总结:深拷贝对第一层元素改变时,拷贝出来的新列表也不会改变
3.集合——set
集合是没用值得字典 { },集合是无序,可变的,集合可以天然去重(唯一),元素时不可变的数据类型。
3.1 定义
s = {1,"alex",False,(1,2,3),12,4,6,32,2}
3.2 操作
3.2.1增
s.add(67) #只能添加一个
s.update("迭代的内容") # 迭代添加
3.2.2 删
s.pop() #随机删
s.remove(1) #指定元素删除
s.clear() # 清空 -- set() 空集合
3.2.3 改
先删再加
3.2.4 查
for i in {1,2,3}:
print(i)
3.2.5 其他操作
s1 = {1,2,3,4,5,6,7}
s2 = {5,6,7,1}
print(s1 & s2) # 交集 {1, 5, 6, 7}
print(s1 | s2) # 并集 {1, 2, 3, 4, 5, 6, 7}
print(s1 - s2) # 差集 {2, 3, 4} 差集是减去相同的元素,打印s1中其他剩下的元素
print(s1 ^ s2) # 反交集 {2, 3, 4} 去两个集合的重
print(s1 > s2) # 父集(超集) True
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}
3.3 集合面试题
1. 用一行代码将列表去重:
lst = [1,2,1,2,4,2,45,3,2,45,2345,]
print(list(set(lst))) # [1, 2, 3, 4, 2345, 45]
python 06 深浅拷贝的更多相关文章
- Python原理 -- 深浅拷贝
python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...
- Python的深浅拷贝
Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...
- 24、简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- Python入门-深浅拷贝
首先我们在这里先补充一下基础数据类型的一些知识: 一.循环删除 1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题: 有这样一个列表: lst = ['周杰伦','周润 ...
- day2学python 数据类型+深浅拷贝+循环
数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫'] print(color[1:3]) //打印[1,3) ...
- 简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- python 赋值 深浅拷贝
深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...
- Python随笔---深浅拷贝
Python中为了避免某些方法的副作用(拷贝后有时更改原有数据),故存在有深浅拷贝的存在 浅拷贝导入copy方法集,使用copy_copy的方法进行 深拷贝一样导入copy方法集,使用copy_dee ...
- python 的深浅拷贝问题
深浅拷贝概念 基本类型和引用类型数据拷贝的问题.因为基本类型的数据大小是固定的,所以他保存在栈内存中:而引用类型的数据大小不固定,因而保存在堆内存中,单引用类型在栈内存中只保存一个指向堆内存的指针. ...
随机推荐
- 曹工杂谈:手把手带你读懂 JVM 的 gc 日志
一.前言 今天下午本来在划水,突然看到微信联系人那一个红点点,看了下,应该是博客园的朋友.加了后,这位朋友问了我一个问题: 问我,这两块有什么关系? 看到这段 gc 日志,一瞬间脑子还有点懵,嗯,这个 ...
- PTA L2-031 深入虎穴 非dfs的一点想法
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...
- npm常用命令(原创)
1.对于我们下载下来的node包,假设该包存在依赖情况执行: npm install(或者npm i) 下载依赖包: 下载依赖成功过后,文件夹内会产生package-lock.json文件: 2.下载 ...
- 使用eclipse编写和运行java程序(基础)
1.首先java程序的运行你需要下载和安装JDK,这是java运行的必备环境. 2.在桌面上找到eclipes,双击打开. 3.在eclipes启动的过程中,会弹出一个窗口,让你填写java工作区的保 ...
- 3PHP如何用PDO的连接方式方式导出mysql数据
首先连接mysql,具体看上一篇 接下来在try{}中加入以下代码 $query="select * from 你的数据表名称" //$query的内容给个SQL ...
- Go中的指针
学Java以来,让程序员忽略了指针和内存地址这些概念,Java帮我们封装了对象,简化了对象引用之间的关系.在Go语言中,又帮我们回忆起这些概念. 我们创建的每一个对象在内存中都有一个位置去存储,每个内 ...
- GBK和UTF-8的区别
我们这里将以最简单最容易理解的方式来描述GBK和UTF8的区别,以及它们分别是什么. GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符 ...
- Redis的分布式和主备配置调研
目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的. 对于一致性哈稀分片的算法,Jedis-2.0.0已经提供 ...
- python 闭包,装饰器,random,os,sys,shutil,shelve,ConfigParser,hashlib模块
闭包 def make_arerage(): l1 = [] def average(price): l1.append(price) total = sum(l1) return total/len ...
- js常见兼容性问题以及解决方法
1.关于使用 event对象,出现的兼容性问题IE/Chrom: event.clientX;event.clientYFF/IE9以上/Chrom: 传参e e.clientX;e.client ...