Python学习-is和==区别, encode和decode
一、is 和 == 介绍
1. is 比较的是两个对象的内存地址是否相同,它们是不是同一个对象。
2. == 比较的是两个对象的内容是否相同。
在使用is前,先介绍Python的一个内置函数id(),它是用于查看对象在内存中的id.
>>> a = 10
>>> b = 'hello'
>>> c= (1, 3, 5)
>>> id(a); id(b); id(c)
4365573024
4372638160
4372561496
代码实例:
# 数字
>>> a = 5
>>> b = 5
>>> print(a==b)
True
>>> a is b
True #字符串
>>> n1 = 'jason'
>>> n2 = 'jason'
>>> print(n1==n2)
True
>>> n1 is n2
True #列表
>>> ls1 = [1, 3, 5, 7]
>>> ls2 = [1, 3, 5, 7]
>>> print(ls1==ls2)
True
>>> ls1 is ls2
False #元组
>>> tu1 = (1, 2, 3)
>>> tu2 = (1, 2, 3)
>>> print(tu1 == tu2)
True
>>> tu1 is tu2
False #字典
>>> info1 = {'name': 'jason', 'age': 25}
>>> info2 = {'name': 'jason', 'age': 25}
>>> print(info1 == info2)
True
>>> info1 is info2
False
>>> id(info1)
4372560920
>>> id(info2)
4367493088 #集合
>>> seta = set(['a', 'b', 'c'])
>>> setb = set(['a', 'b', 'c'])
>>> print(seta == setb)
True
>>> seta is setb
False
总结:
当对象为数字、字符串时,对象1 is 对象2为True;当对象为列表、元组、字典、集合时,对象1 is 对象2为False。
再看下面的一组列子:
>>> a = -4 # 对象也为数字,为什么为False了
>>> b = -4
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False >>> a = 'hello'
>>> b = 'hello'
>>> a is b
True
>>> new_a = a * 20
>>> new_b = b * 20
>>> new_a is new_b
False
注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。
二、encode和decode
注意:
1) python2中默认使用的是ASCII码,所以默认不支持中文.
2) python3中默认使用的是unicode码
在Python的内存中, 在程序的运行阶段, 使用的是unicode编码. 因为unicode是万国码, 什么内容都可以显示, 但是在数据传输和存储的时候, 由于unicode比较浪费空间和资源, 需要把unicode转成UTF-8或GBK进行存储. 怎么转换呢, 在python中可以对文字信息进行编码, 编码之后的内容就可以进行传输了. 编码之后的数据是bytes类型的数据. 其实, 还是原来的数据, 只是经过编码之后, 表现形式发生了改变而已.
字符串在传输的时候转换成bytes, 由encode来完成.
代码示例:
name = 'jason'
name1 = name.encode('utf-8')
print(name1)
name2 = name.encode('GBK')
print(name2) s = '好'
s1 = s.encode('utf-8') #utf-8编码,中文占3个字节
print(s1)
s2 = s.encode('GBK') #GBK编码, 中文占2个字节
print(s2) #执行结果:
b'jason'
b'jason'
b'\xe5\xa5\xbd'
b'\xba\xc3'
英文编码之后的结果和源字符串一致. 中文编码之后的结果, 根据编码的不同, 得到的编码结果也不同. 从上方代码示例可以看出, 一个中文的utf-8编码是三个字节. 一个GBK的中文编码是两个字节.编码之后的类型就是bytes类型. 在网络传输和存储的时候, python保存和存储的就是bytes类型. 那么对方接收的时候, 也是接收的bytes类型的数据, 可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串.
greeting = '你好世界'
s = greeting.encode('utf-8')
print(s)
s1 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
print(s1.decode('utf-8')) #运行结果
b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'
你好世界 # \x分隔的, 每个\x和其后字符, 表示的是一个字节
编码和解码的时候都需要指定编码格式:
s = '你好'
s2 = s.encode('GBK')
print('s2:', s2)
# 把GBK转为utf-8, 首先要把GBK转为unicode,也就是需要解码
s3 = s2.decode('GBK')
# 重新编码成utf-8
s4 = s3.encode('utf-8')
print('s4:', s4) # 运行结果
s2: b'\xc4\xe3\xba\xc3'
s4: b'\xe4\xbd\xa0\xe5\xa5\xbd'
以上就是关于编码解码的简单解释.
Python学习-is和==区别, encode和decode的更多相关文章
- python day- 6 is 和 ==的区别 encode 和 decode
1.is 和 == 的区别. == 是由来判断左右两边的内容是否相等. is 是用来判断内存地址是否相同. 引进 id ( )函数 小数据池: 对于字符串 ,数字 ,bool 值进行 id()计 ...
- [转载] python必碰到的问题---encode与decode,中文乱码
阅读来源: 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicod ...
- 配置python学习环境遇到的问题:[Decode error - output not utf-8]
因为前阵子学习monkeyrunner的时候,碰到了很多关于.py的脚本,其实我是一知半解的,也没打算去学习一下.将就着看看吧,后来无意中看到自动化测试工程师都要求会脚本语言的时候,刺激了我,想了想, ...
- Python—编码与解码(encode()和decode())
编码与解码 decode英文意思是解码,encode英文原意是编码. Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化.编码是 unicode -> str ...
- 【python】浅谈encode和decode
对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点. 编码的理解: 1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它 ...
- python的str,unicode对象的encode和decode方法, Python中字符编码的总结和对比bytes和str
python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...
- 【python】python新手必碰到的问题---encode与decode,中文乱码[转]
转自:http://blog.csdn.net/a921800467b/article/details/8579510 为什么会报错“UnicodeEncodeError:'ascii' codec ...
- python encode和decode函数说明【转载】
python encode和decode函数说明 字符串编码常用类型:utf-8,gb2312,cp936,gbk等. python中,我们使用decode()和encode()来进行解码和编码 在p ...
- python的str,unicode对象的encode和decode方法
python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...
随机推荐
- Python 命令行之旅:深入 argparse(二)
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 自由变形技术(Free-Form Deformation)
自由变形技术Free-Form Deformation是编辑几何模型的重要手段,它于80年代由Sederberg等人提出,目前许多三维建模软件中都有这种变形算法.自由变形方法在变形过程中并不是直接操作 ...
- MySql优化相关概念的理解笔记
MySQL架构 查询执行流程 查询执行的流程是怎样的: 连接1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求1.2将请求转发到‘连接进/线程模块’1.3调用‘用户模块’来进行授 ...
- P1251 餐巾计划问题 费用流
https://www.luogu.org/problemnew/show/P1251 题意 有一家酒店,酒店每天需要ri张桌布,桌布可以现买,p元.可以通过快洗店,等m天,f元.可以通过慢洗店,等n ...
- cogs 1377. [NOI2011] NOI嘉年华 (dp
题意:给你n个活动的起止时间,要你从中选一些活动在2个会场安排(不能有两个活动在两个会场同时进行),使活动较少的会场活动数最大,以及在某个活动必须选择的前提下,求该答案. 思路:由于n很小,时间很大, ...
- HDU 4479 Shortest path 带限制最短路
题意:给定一个图,求从1到N的递增边权的最短路. 解法:类似于bellman-ford思想,将所有的边先按照权值排一个序,然后依次将边加入进去更新,每条边只更新一次,为了保证得到的路径是边权递增的,每 ...
- Atcoder C - Nuske vs Phantom Thnook(递推+思维)
题目链接:http://agc015.contest.atcoder.jp/tasks/agc015_c 题意:给一个n*m的格,蓝色的组成路径保证不成环,q个询问,计算指定矩形区域内蓝色连通块的个数 ...
- bzoj 1051 [HAOI2006]受欢迎的牛(tarjan缩点)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051 题解:缩点之后判断出度为0的有几个,只有一个那么输出那个强连通块的点数,否者 ...
- JPA案例
ORM 什么是ORM: 对象关系映射(Object Relational Mapping,简称ORM)是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的. ORM思想 主要 ...
- VS Code配置Go语言开发环境
VS Code是微软开源的一款编辑器,插件系统十分的丰富.本文就介绍了如何使用VS Code搭建Go语言开发环境. VS Code配置Go语言开发环境 说在前面的话,Go语言是采用UTF8编码的,理论 ...