id+is+深浅co'p'y
day06
一、id、is
关键字:id #唯一的,如果id相同,说明2个变量指向同一个地址,就是变量一==变量二
注意:id相同值一定相同,值相同但是id不一定相同(不同代码块的值相同,他们就像太阳和月亮毫无关系)
用法:查看内存地址
例子:
i = 10
o = 10
print(i == o) #ture 判断是否相同
print(id(i)) #140718777659952
print(id(o)) #140718777659952
关键字:is
用法:判断2个变量的内存地址是否相同
例子:
i = 10
o = 10
print(i is o)
二、代码块
2.1、什么是代码块?
答:一个模块、一个函数、一个类、一个文件等都是一个代码块。作为交互式的的输入命令都是一个代码块:例如windows中的cmd上面敲的python命令!
2.2、两个机制:
同一个代码块,有一个机制。不同的代码块,遵循另一个机制。
2.2.1、同一代码块下的缓存机制(代码块的缓存机制):
Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将 其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值 存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使 用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两 个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
三、小数据池(另一个机制)可理解为:有范围的缓存机制
Python自动将-5~256的整数进行了**缓存**,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
四、集合
集合的特点:
1、容器型的数据类型
2、要求里面的元素是不可变的数据
3、但是他本身是可变的数据类型
4、集合是无序的(没有重复值,重复算一个)
集合的用处:
1、列表的去重
2、关系测试:交集、并集、差集
集合从创建:
set1 = {1,3,4,5,'aa','vv'}
print(set1) #输出是无序的
#空集合
set1 = set()
集合增删查改:
jh = {'a','b','c'}
#增
jh.add('xx')
#迭代增加,每个元素都增加进去了
jh.update('plord')
print(jh)
#删元素
#remove 按照元素删除,无序不能按照索引删除
jh.remove('b')
#pop 随机删除
jh.pop()
print(jh)
#clear 清空
jh.clear()
#del 删除集合
del jh
#改不能直接改,可以变相改!!!也就是先删除,再新增一个!!!
jh.remove('b')
jh.add('xx')
#查 for循环便利
for i in jh:
print(i)
交集|并集|差集|反交集|子集|超集:
jh1 = {1,2,3,4,8,9}
jh2 = {2,3,4,5,6,7}
#交集 &
print(jh1 & jh2)
#并集 | 或者 union
print(jh1 | jh2)
#差集 - (jh1有的jh2没有)
print(jh1 - jh2)
#jh3有的jh1没有
print(jh2 - jh1)
#反交集
print(jh2 ^ jh1)
#####
jh3 = {1,2,3,}
jh4 = {1,2,3,4,5,6,7}
print(jh3<jh4) #子集 返回true或者false
print(jh3>jh4) #超集 返回true或者false
五、深浅copy(列表、字典都有)
深copy其实就是完全复制一份,浅copy部分复制一份的意思!
浅copy:就是copy一个外壳,原来内容的地址都一样
深copy:
5.1、赋值运算
l2 = l1 所以同一块内存,然后l1新增,l2也会改变
l1 = [1,2,3,['barry','alex']]
l2 = l1
l1[0] = 111
print(l1) # [111, 2, 3, ['barry', 'alex']]
print(l2) # [111, 2, 3, ['barry', 'alex']]
l1[3][0] = 'wusir'
print(l1) # [111, 2, 3, ['wusir', 'alex']]
print(l2) # [111, 2, 3, ['wusir', 'alex']]
5.2、浅copy(同一代码块)
#同一代码块下:
l1 = [1, 'll', True, (1,2,3), [22, 33]]
l2 = l1.copy()
#先看看是不是在同一块内存(显然不是啊)但是里面的都一样
print(id(l1), id(l2)) #1953402082312 1953402647368
print(id(l1[1]),id(l2[1])) #1940390867056 1940390867056
#小列表
print(id(l1[-2]), id(l2[-2])) #1959984831768 1959984831768
#小列表的是同一块内存,改其中一个两个都会被改
print(id(l1[-1]),id(l2[-1])) #1959955223048 1959955223048
5.3、浅copy:(不同代码块)
# 不同代码块下:
>>> l1 = [1, 'll', True, (1, 2, 3), [22, 33]]
>>> l2 = l1.copy()
>>> print(id(l1), id(l2))
1477183162120 1477183162696
>>> print(id(l1[-2]), id(l2[-2]))
1477181814032 1477181814032
>>> print(id(l1[-1]), id(l2[-1]))
1477183162504 1477183162504
5.4、深拷贝deepcopy
# 同一代码块下
import copy
l3 = [1, 'aaa', [22, 33]]
l4 = copy.deepcopy(l3)
print(l3,l4) #内容是一样滴 都是[1, 'aaa', [22, 33]]
print(id(l3),id(l4)) #内存不一样 3153608047880 3153608048136
#增加一个再打印看看效果
l3.append('b')
print(l3,l4) #只有l3有新增的,l4没有
#增加一个再打印看看效果
l3[-1].append('b')
print(l3,l4) #只有l3有新增的,l4没有
# 不同代码块下
>>> import copy
>>> l1 = [1, 'xxx', True, (1, 2, 3), [22, 33]]
>>> l2 = copy.deepcopy(l1)
>>> print(id(l1), id(l2))
1477183162824 1477183162632
>>> print(id(0), id(0))
1470562736 1470562736
>>> print(id(-2), id(-2))
1470562672 1470562672
>>> print(id(l1[-1]), id(l2[-1]))
1477183162120 1477183162312
图解:
id+is+深浅co'p'y的更多相关文章
- 为什么你需要使用instancetype而不是id
四年前Clang添加了关键字instancetype,目的在于取代-alloc和-init等方法的返回类型id,那么使用instancetype到底比id好在哪里? instancetype宣言 不管 ...
- 【收藏】JS获取鼠标的X,Y坐标位置
JS的方法: <html> <head> <meta http-equiv="Content-Type" content="text/htm ...
- copy之深浅拷贝
深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...
- python中的id
python对象都有三个特性分别是身份.类型.值,身份指该对象内存地址,内建函数id()可获得身份,类似于指针的地址,但不能控制这个值,类型决定对象可以保存什么类型的值,值是对象表示的数据项,pyth ...
- python 字典,列表,集合,字符串,基础进阶
python列表基础 首先当然是要说基础啦 列表list 1.L.append(object) -> None 在列表末尾添加单个元素,任何类型都可以,包括列表或元组等 2.L.extend(i ...
- Python 【基础面试题】
前言 面试题仅做学习参考,学习者阅后也要用心钻研其中的原理,重要知识需要系统学习.透彻学习,形成自己的知识链.以下五点建议希望对您有帮助,早日拿到一份心仪的offer. 做好细节工作,细致的人运气不会 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 《转载》PAT 习题
博客出处:http://blog.csdn.net/zhoufenqin/article/details/50497791 题目出处:https://www.patest.cn/contests/pa ...
- QML 从无到有 2 (移动适配)
随着项目深入,需要移植到安卓上,问题来了,QML安卓适配! 幸好PC端程序和手机屏幕长宽比例相似.虽然单位像素,尺寸不同,通过比例缩放,可以实现组件PC和安卓通用代码. 第一步:定义全局的转换函数(3 ...
随机推荐
- 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)
上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现. 交并比IOU(Intersection over union) 在目标检 ...
- CTF资源
WINDOWS 逆向工程师技能表 https://www.sec-wiki.com/skill/6 Software-Security-Learning https://chybeta.github. ...
- Redis源码笔记--服务器日志和函数可变参数处理server.c
前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...
- docker下部署jira破解版
1. 制作Docker破解容器 在/opt/jira下新建一个Dockerfile文件 touch Dockerfile 编辑Dockerfile文件 vim Dockerfile FROM cpta ...
- 万字详解TDengine 2.0整体架构设计思路
导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...
- 第一次软件工程与UML作业
这个作业属于哪个课程 https://url.cn/IMQa18Jo 这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/ ...
- x86-TSO : 适用于x86体系架构并发编程的内存模型
Abstract : 如今大数据,云计算,分布式系统等对算力要求高的方向如火如荼.提升计算机算力的一个低成本方法是增加CPU核心,而不是提高单个硬件工作效率. 这就要求软件开发者们能准确,熟悉地运用高 ...
- hystrix(1) 概述
首先我们来讲一下hystrix解决什么问题.在大型分布式系统中经常会存在下面的几类问题: 1.大型分布式系统中,服务之间相互依赖,如果依赖的服务发生异常,那么当前服务也会出现异常,这样将会导致联级的服 ...
- kubeadm单集群部署k8s1.15.1&calico网络
说明 本次实验在Windows下的VMware进行 系统配置及初始化配置在所有的主机执行 容器镜像全部替换为国内可拉取的 pod网络采用calico 实验环境 主机名 IP地址 角色 OS CPU/M ...
- Python爬虫之反爬虫---使用随机User-Agent
在编写爬虫时,大多数情况下,需要设置请求头.而在请求头中,随机更换User-Agent可以避免触发相应的反爬机制. 使用第三方库fake-useragent便可轻松生成随机User-Agent. 使用 ...