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 ...
随机推荐
- 浅析LR.Net工作流引擎
在当代信息化软件系统开发中,工作流引擎是其中非常重要的一环.所谓工作流引擎,是指工作流作为软件系统的一部分, 其中包括了流程的节点管理.流向管理.流程样例管理.审核管理等重要功能. 工作流引擎可根据角 ...
- Sentinel使用
Sentinel控制台的功能主要包括:流量控制.降级控制.热点配置.系统规则和授权规则等 # 安装sentinel的控制台 ## 下载地址 Sentinel控制台下载地址: https://githu ...
- 字符串对象跟xml格式的转换
package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...
- linux vi编辑
编辑模式 使用vi进入文本后,按i开始编辑文本 退出编辑模式 按ESC键,然后: 退出vi :q! 不保存文件,强制退出vi命令 :w 保存文件,不退出vi命令 :wq 保存文件,退出vi命令 中断v ...
- ubuntu安装docker-ce 、docker-ce-cli、containerd.io
问题 ubuntu安装docker的时候特别慢,百度搜了一大堆都没讲到点子上,最后请教了大佬才知道是源的问题 安装 修改源 sudo gedit /etc/apt/sources.list 添加源 阿 ...
- leetcode刷题-70爬楼梯
题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 思路 最开始使用的是回溯的方法,但是时间效 ...
- Cassandra Vnodes在Cassandra 2.0-4.0中的演进
Vnodes简短历史 Vnodes又叫Virtual Nodes.是Cassandra在1.2版本里引入的功能,已经在生产环境中使用了近8年了.从2.0版本开始,因为默认配置里num_tokens一般 ...
- Odoo10.0中的工作流
Odoo10.0中可以通过两种方式来实现工作流(workflow) 一种的官网API中给出的方式,链接:https://www.odoo.com/documentation/10.0/referenc ...
- 自定义 NSLog以便发版和调试
问题 开发中用了大量的 NSLog,但是发布时想取消这些 NSLog 开发中是否经常用过 NSLog(@"%s", __FUNCTION__); 解决问题 新建 ExtendNSL ...
- Mybatis和Mybatis-Plus时间范围查询,亲测有效
一.mysql 1.传入时间范围参数类型是字符串 <if test="startTime!=null and startTime.trim() neq ''"> and ...