一、小数据池

  1、代码块
  python程序是由代码块构成的。一个代码块的文本作为python程序执行的单元。代码块: 一个模块, 一个函数, 一个类, 甚至每一个command命令都是一个代码块. 一个文件也是一个代码块, eval()和exec()执行的时候也是一个代码块。
 
  2、小数据池:一种数据缓存机制,也被成为驻留机制,它只针对整数、字符串、布尔值(不可变)其他数据类型不存在驻留机制。
  在python中对-5 ~256之间的整数会被驻留在内存中,将一定规则的字符串缓存,在使用的时候,内存中只会创建一个该数据的对象,保存在小数据池中,当使用的时候直接从小数据池中获取对象的内存引用,而不需要创建一个新的数据,节省内存区域。
  优点:能够提高一些字符串、整数的处理速度,省略创建对象的过程
  缺点:在池中创建或者插入新内容会花费更多时间
 
  3、针对数字、字符串
    (1)数字:-5~256是会被加到小数据池中的,每次使用都是同一对象
    (2)字符串:
    <1>如果字符串的长度是0 或 1,都会默认进行缓存
    <2>字符串长度大于1,但字符串中只含字母、数字、下划线时才会缓存
    <3>用乘法得到的字符串,乘数为1,只含字母、数字、下划线时才会缓存,如果包含其他字符,而长度<=1也会被驻存。乘数大于 1,只含字母、数字、下划                                      线时才会缓存,但字符串长度<=20
    <4>指定驻留,通过导入os模块

 from sys import intern()
a = intert('#$%^*fjewio')
b = intert('#$%^*fjewio')

  在代码块内的缓存机制是不一样的. 在执行同一个代码块的初始化对象的命令时, 会检查是否其值是否已经存在, 如果存在, 会将其重用. 换句话说: 执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中, 在遇到新的变量时, 会先在字典中查询记录, 如果有同样的记录那么它会重复使用这个字典中的之前的这个值. 所以在你给出的例子中, 文件执行时(同一个代码块) 会把a, b两个变量指向同一个对象.如果是不同的代码块, 他就会看这个两个变量是否是满足小数据池的数据, 如果是满足小数据池的数据则会指向同一个地址. 所以: a, b的赋值语句分别被当作两个代码块执行, 但是他们不满足小数据池的数据所以会得到两个不同的对象, 因此is判断返回False.

二、is 和 ==的区别

  1、id() #通过id()可以查看一个变量表示的值在内存中的地址。
  2、is :判断左右两端内容的内存地址是否一致,如果返回True则两变量使用的是同一对象
  3、== :判断左右两端的值是否相等,内容是不是一样的
  内存地址相同,那么值一定是相等的,如果值相等,则不一定是同一个对象。

三、编码、解码

  1、回顾
  ASCII码 只有大小写字母、数字、一些特殊字符,没有中文,8 bit(1B)
  GBK:中文编码里面包含ASCII,16bit(2B)
  Unicode:万国码,32bit(4B)
  UTF-8:可变长万国码,是Unicode的一种实现,最小字符占8位,英文8bit(1B)、欧洲 16bit(2B)、中文24bit(3字节)
  除了ascii码以外,其他信息不能直接转换。
 
  2、Unicode和utf-8
  在python3的内存中,在程序运行阶段,使用的是Unicode编码,因为Unicode是万国码,什么内容都可以进行显示,那么在数据传输和储存的时候由于Unicode比较浪费空间和资源,需要把Unicode转存成utf-8或者GBK进行存储,在python中科院把文字信息进行编码,编码之后的内容就可以进行传输了,编码之后的数据是bytes类型数据
  bytes的表现形式:1.英文 b'alex' 2.中文 b'\xe4\xb8\xad'
 
  3、编码解码
  字符串在传输时转换成bytes =>encode(字符集)来完成

 s = 'alex'
print(s.encode('utf-8')) # 将字符串编码成UTF-8
print(s.encode('GBK')) #将字符串编码成GBK
结果:
b'alex'
b'alex' s = '中'
print(s.encode('utf-8')) # 将字符串编码成UTF-8
print(s.encode('GBK')) #将字符串编码成GBK
结果:
b'\xe4\xb8\xad'
b'\xd6\xd0'

  注意:英文编码之后的结果和源字符串一致,中文编码之后的结果根据编码的不同,编码结果也不同,我们能看到,一个中文的UTF-8是3字节,一个GBK的中文编码是2字节。编码之后的数据类型是bytes,在网络传输和存储的时候我们python是保存和存储的bytes类型,那么在对方接收的时候,也是接收的是bytes类型的数据,我们可以使用decode()来进行解码操作,把bytes类型的数据还原回字符串

 s = "我叫李嘉诚"
print(s.encode("utf-8")) #
b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'
print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解码

  编码和解码的时候都需要指定编码格式

 s = "我是文字"
bs = s.encode("GBK") # 我们这样可以获取到GBK的文字
# 把GBK转换成UTF-8
# 首先要把GBK转换成unicode. 也就是需要解码
s = bs.decode("GBK") # 解码
# 然后需要进行重新编码成UTF-8
bss = s.encode("UTF-8") # 重新编码
print(bss)

06_python_小数据池/ is == /编码的更多相关文章

  1. python学习笔记:第6天 小数据池和编码转换

    目录 1. id 和 == 2. 小数据池 3. 编码和解码 1. id 和 == id:id是一个内置的函数,可以查看变量存放的内存地址(实际上不是真正的物理地址,这里暂时这样理解),用于判断是变量 ...

  2. python 浅谈小数据池和编码

    ⼀. ⼩数据池 在说⼩数据池之前. 我们先看⼀个概念. 什么是代码块: 根据提示我们从官⽅⽂档找到了这样的说法: A Python program is constructed from code b ...

  3. python:id与小数据池与编码

    一.id与小数据池 id:查的是内存地址 a = 100 b = 100 print(a == b)#比较的数值 print(a is b)#比较的是id print(id(a),id(b))#id相 ...

  4. 《Python》 代码块、小数据池和编码转换

    一.代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 什么是代码块:一个py文件,一个函数,一个文件,一个类都是一个代码块. 作为交互方式输入的每一行 ...

  5. python基础4(小数据池,编码,深浅拷贝)

    1.==与is == 比较值是否相等 is比较内存地址是否相同 2.小数据池 为了节省内存,当数据在一个范围里的时候,两个值相同的变量指向的是小数据池里的同一个地址 数字范围:-5 ~ 256 num ...

  6. day06 小数据池和编码

    一. 上次课内容回顾字典:由{}括起来. 每个元素用逗号隔开, key:value的形式存储数据key: 不可变的. 可哈希的.增删改查:1. 增加: 直接用新key来赋值. dict[key] = ...

  7. 6,id 小数据池,编码and解码。

    asscii :8位(数字,英文,特殊字符)表示一个字符. A:0000 0001 unicode :(万国码)初期:16位,两个字节,表示两个字符. A:0000 0001 0000 0001 中: ...

  8. python小整数与str数据池,编码关系

    1.小数据池:数字,字符串 数字的范围-5 ---256 字符串:1,不能有特殊字符 2,s*20 还是一个地址,s*21以后都是两个地址 2.编码关系:ascii A : 00000010 8位 一 ...

  9. id,is的用法,小数据池的概念及编码知识进阶

    一:id 查询内存地址 name = 'alex' print(id(name)) li = [1,2,3] print(id(li)) 二:is  判断的是内存地址 name1 = 'alex@' ...

随机推荐

  1. NOIP训练测试2(2017081502)

    唔,这是今天第二场训练测试. 上一轮不够难,现在来一波更简单的.[滑稽] 注意时间! 测试时间:3小时 题目一:Cantor表 题目二:回文数 题目三:拼数 题目四:进制位 题目五:邮票面值设计 都是 ...

  2. 爬虫模块之requests模块

    一 模块的下载安装 pip install requests 二 爬虫的介绍 什么是爬虫:就是模拟浏览器发送请求:保存到本地:提取有用的数据:保存到数据库 爬虫的价值:获取有用的数据,保存到数据库 爬 ...

  3. 2018.10.29 NOIP训练 数据结构(带修改莫队)

    传送门 带修莫队板题. 直接按照经典写法做就行了. 代码

  4. 2018.06.27Dual Core CPU(最小割)

    Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 26136 Accepted: 11270 Cas ...

  5. vi三种模式的切换

    基础上vi/vim共分为三种模式,分别是命令模式,输入模式和底线命令模式. 一.命令模式 用户刚刚启动vi/vim,便进入了命令模式. 在此状态下敲击键盘动作会被vim识别为命令,而非输入字符.比如我 ...

  6. 第12章:MongoDB-CRUD操作--文档--查询--游标详解

    ①是什么游标 游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口. 客户端通过对游标进行一些设置就能对查询结果进行有效地控制,如可以限制查询得到的结果数量. ...

  7. java -help

    Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args... ...

  8. Android 批量打包利器

    因为添加了渠道号,对应不同的渠道包,此时,动不动就几十个包,实在让人头疼,此时,需要引入自动打包功能. 首先,列举出援引的博客内容 美团Android自动化之旅—生成渠道包 http://tech.m ...

  9. 《it项目管理那些事》学习笔记

    此书适合:计算及相关专业的学生,想成为测试工程师.软件工程师.进入项目经理的人,或者经验丰富的it经理人. 之所以称为学习笔记,是加上我从百度搜到一些在看书过程中不明白的it语,作为菜鸟的我,得多看看 ...

  10. VS2010与VS2013中的多字节编码与Unicode编码问题

    1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t.  char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...