1. 小数据池

​ 小数据池——缓存机制(驻留机制)

数字的范围为:-5~256(在此范围内的数字,内存地址相同)

1.1 代码块

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

支持的数据类型:

  1. 数字类型:

    在同一代码块下 只要内容相同就采用相同的内存地址(-5 ~ 正无穷大);

    数字在做乘法的时候范围 -5 ~ 256

​ 数字在做乘法的时候不能使用浮点数,否则地址不同。

  1. 字符串类型:

​ 在同一代码块下 只要内容相同就采用相同的内存地址;

乘法的时候总长度不能超过20,内存地址相同;

​ 乘法的时候中文,特殊符号乘以1或0,内存地址相同。

  1. 布尔值:

​ 在同一代码块下 只要内容相同就采用相同的内存地址。

1.2 小数据池

支持的数据类型:

  1. 数字类型:

    数字范围 -5 ~ 256

  2. 字符串类型:

​ 纯字母、数字任意长度,只要内容相同就采用相同的内存地址;

只有乘法的时候总长度不能超过20,内存地址相同;

​ 乘法的时候中文,特殊符号乘以0,内存地址相同。

  1. 布尔值:

​ 只要内容相同就采用相同的内存地址。

1.3 执行顺序 (代码块--小数据池)

​ 小数据池的验证方法,必须脱离代码块才能进行验证。否则会先执行代码块的规则,再执行小数据池的验证规则。

1.4 "=="和 “is”

  1. "== 判断等号两边值是否相等
  2. "is" 判断两边的值内存地址是否相等

2. 深浅拷贝

2.1 赋值

​ 多个变量名指向同一个内存地址

​ 一个变量对其进行操作,其他变量查看时都变动

  1. lst = [1,2,3,[4,5,6]]
  2. lst1 = lst
  3. print(lst1)
  4. print(lst)
  5. lst[-1].append(8)
  6. print(lst1) # lst、lst1都改变
  7. print(lst)

2.2 浅拷贝: copy()

2.2.1 本质

​ 浅拷贝的时候,只会开辟一个新的容器列表(内存空间),使用的都是源列表中的元素。

  1. lst1 = lst.copy()
  2. print(lst[-1]) # [4,5,6]
  3. print(lst1[-1]) # [4,5,6]
  4. print(id(lst[-1])) # id 内存地址也一样
  5. print(id(lst1[-1]))

2.2.2 特征

lst[ : ] -- 也是浅拷贝;

浅拷贝只拷贝第一层元素;

修改第一层元素时,新开辟了内存空间,则不会进行改变;修改第二层及以上元素时,会改变。

  1. lst = [1,2,3,[4,5,6]]
  2. lst1 = lst.copy() #浅拷贝
  3. lst[0]=10
  4. print(lst) # 会变[10, 2, 3, [4, 5, 6]]
  5. print(lst1) # 不会变[1, 2, 3, [4, 5, 6]]
  6. # 总结:当改变第一层元素(不可变数据类型)时,拷贝出来的新列表不会改变
  7. lst = [1,2,3,[4,5,6]]
  8. lst1 = lst.copy()
  9. lst[-1]=4
  10. print(lst) # 会变 [1, 2, 3, 4]
  11. print(lst1) # 不会变[1, 2, 3, [4, 5, 6]]
  12. # 总结:当改变第一层元素(可变数据类型)时,拷贝出来的新列表不会改变
  1. lst = [1,2,3,[4,5,6]]
  2. lst1 = lst.copy()
  3. lst[-1][-1]=10
  4. print(lst) # 会变[1, 2, 3, [4, 5, 10]]
  5. print(lst1) # 会变[1, 2, 3, [4, 5, 10]]
  6. #总结:当修改(增删改)第一层元素中可变数据类型(第二层元素)时,拷贝出来的新列表会改变,两个列表相同
  1. dic = {"alex":[1,2,3,[4,5,6]]}
  2. dic1 = dic.copy()
  3. dic["alex"].append (0)
  4. print(dic) #{'alex': [1, 2, 3, [4, 5, 6], 0]}
  5. print(dic1) #{'alex': [1, 2, 3, [4, 5, 6], 0]}
  6. #总结:字典存在的值就是第二层元素
  7. dic = {"alex":[1,2,3,[5,6]]}
  8. dic1 = dic.copy()
  9. dic["wusir"]=[7,8] #增加新的键值对
  10. # dic["alex"]=[7,8] #替换键值对的整体值
  11. print(dic) # {'alex': [1, 2, 3, [5, 6]], 'wusir': [7, 8]}
  12. print(dic1) # {'alex': [1, 2, 3, [5, 6]]}
  13. #总结:如果是新增/减键值对或者是替换键值对的整体值,那就是在改第一层元素,不会改变

2.3 深拷贝:copy.deepcopy()

2.3.1 格式

  1. import copy #导入
  2. lst = [1,2,3,[4,5,6]]
  3. lst1 = copy.deepcopy(lst) # 深拷贝
  4. print(lst)
  5. print(lst1)

2.3.2 特征

​ 不可变的数据类型共用,可变的数据类型重新开辟一个空间对源数据进行修改; 深拷贝的内容都不会改变。

  1. import copy
  2. lst = [1,2,3,[4,5,6]]
  3. lst1 = copy.deepcopy(lst)
  4. lst[-1][-1] = 10
  5. print(lst) #会变[1, 2, 3, [4, 5, 10]]
  6. print(lst1) #不变[1, 2, 3, [4, 5, 6]]
  7. import copy
  8. lst = [1,2,3,[4,5,6]]
  9. lst1 = copy.deepcopy(lst)
  10. lst[-1].append(7)
  11. print(lst) #会变[1, 2, 3, [4, 5, 6, 7]]
  12. print(lst1) #不变[1, 2, 3, [4, 5, 6]]
  13. #总结:深拷贝对第二层元素改变时,拷贝出来的新列表不会改变
  1. import copy
  2. lst = [1,2,3,[4,5,6]]
  3. lst1 = copy.deepcopy(lst)
  4. lst[-1] = 10
  5. print(lst) #会变[1, 2, 3, 10]
  6. print(lst1) #不变[1, 2, 3, [4, 5, 6]]
  7. #总结:深拷贝对第一层元素改变时,拷贝出来的新列表也不会改变

3.集合——set

​ 集合是没用值得字典 { },集合是无序,可变的,集合可以天然去重(唯一),元素时不可变的数据类型。

3.1 定义

  1. s = {1,"alex",False,(1,2,3),12,4,6,32,2}

3.2 操作

3.2.1增

  1. s.add(67) #只能添加一个
  2. s.update("迭代的内容") # 迭代添加

3.2.2 删

  1. s.pop() #随机删
  2. s.remove(1) #指定元素删除
  3. s.clear() # 清空 -- set() 空集合

3.2.3 改

  1. 先删再加

3.2.4 查

  1. for i in {1,2,3}:
  2. print(i)

3.2.5 其他操作

  1. s1 = {1,2,3,4,5,6,7}
  2. s2 = {5,6,7,1}
  3. print(s1 & s2) # 交集 {1, 5, 6, 7}
  4. print(s1 | s2) # 并集 {1, 2, 3, 4, 5, 6, 7}
  5. print(s1 - s2) # 差集 {2, 3, 4} 差集是减去相同的元素,打印s1中其他剩下的元素
  6. print(s1 ^ s2) # 反交集 {2, 3, 4} 去两个集合的重
  7. print(s1 > s2) # 父集(超集) True
  8. print(s1 < s2) # 子集 False
  9. print(frozenset(s1)) # 冻结集合 frozenset({1, 2, 3, 4, 5, 6, 7})
  10. dic = {frozenset(s1):1}
  11. print(dic) #和字典使用,{frozenset({1, 2, 3, 4, 5, 6, 7}): 1}

3.3 集合面试题

1. 用一行代码将列表去重:

  1. lst = [1,2,1,2,4,2,45,3,2,45,2345,]
  2. print(list(set(lst))) # [1, 2, 3, 4, 2345, 45]

python 06 深浅拷贝的更多相关文章

  1. Python原理 -- 深浅拷贝

    python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...

  2. Python的深浅拷贝

    Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...

  3. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  4. Python入门-深浅拷贝

    首先我们在这里先补充一下基础数据类型的一些知识: 一.循环删除 1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题: 有这样一个列表: lst = ['周杰伦','周润 ...

  5. day2学python 数据类型+深浅拷贝+循环

    数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫'] print(color[1:3]) //打印[1,3) ...

  6. 简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  7. python 赋值 深浅拷贝

    深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...

  8. Python随笔---深浅拷贝

    Python中为了避免某些方法的副作用(拷贝后有时更改原有数据),故存在有深浅拷贝的存在 浅拷贝导入copy方法集,使用copy_copy的方法进行 深拷贝一样导入copy方法集,使用copy_dee ...

  9. python 的深浅拷贝问题

    深浅拷贝概念 基本类型和引用类型数据拷贝的问题.因为基本类型的数据大小是固定的,所以他保存在栈内存中:而引用类型的数据大小不固定,因而保存在堆内存中,单引用类型在栈内存中只保存一个指向堆内存的指针. ...

随机推荐

  1. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  2. 整合SSM框架必备基础—SpringMVC(下)

    在上一篇文章<整合SSM框架必备基础-SpringMVC(上)>中,胖达介绍了关于SpringMVC的诞生.优势以及执行流程等理论知识点,这篇文章打算在实操中加深一下对SpringMVC的 ...

  3. Linux小火车和流星雨

    一.流星雨 [root@localhost ~]# wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix ...

  4. Spring MVC中的 权限拦截定义 以及 权限拦截的研发步骤

    权限拦截 (拦截器: 对请求进行区分) 1 实现的价值(作用) 用户未登录:访问没用登录的URL,拦截到以后 跳转回登录 用户未登录:访问登录的URL,直接放行到后续流程处理框架,进行后续的操作 用户 ...

  5. TestNG在Eclipse中运行的几种方法

    目录 1 在Eclipse Outline视图中,点右键run as TestNG Test (不推荐) 2 在Eclipse类编辑界面,直接点击右键run as TestNG Test 3 通过Te ...

  6. 华为路由交换综合实验 ---IA阶段

    目录 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 华为路由交换综合实验 ---IA阶段 实验拓扑 实验需求 根据拓扑合理规划IP地址以及VLANIf地址(PC1属于运营部,PC2属于市场 ...

  7. codeforces 340 A. The Wall

    水水的一道题,只需要找xy的最小公倍数,然后找a b区间有多少个可以被xy的最小公倍数整除的数,就是答案. //============================================ ...

  8. HttpClientFactory 使用说明 及 对 HttpClient 的回顾和对比

    目录 HttpClient 日常使用及坑点: HttpClientFactory 优势: HttpClientFactory 使用方法: 实战用法1:常规用法 1. 在 Startup.cs 中进行注 ...

  9. 使用Junit测试一个 spring静态工厂实例化bean 的例子,所有代码都没有问题,但是出现java.lang.IllegalArgumentException异常

    使用Junit测试一个spring静态工厂实例化bean的例子,所有代码都没有问题,但是出现 java.lang.IllegalArgumentException 异常, 如下图所示: 开始以为是代码 ...

  10. prometheus-kafka-exporter部署

    chart地址:https://gkarthiks.github.io/helm-charts/charts/prometheus-kafka-exporter/ 1.下载chart $ helm r ...