1. is 和 == 的区别

  1. id(): 通过id()我们可以查看到⼀个变量表⽰的值在内存中的地址.

    id(变量)  返回给你这个变量的内存地址

    is 比较是的内存地址

     == 比较的是值

s = 'alex'
print(id(s)) # 4326667072
s = "alex"
print(id(s)) # 4326667072
lst = [1, 2, 4]
print(id(lst)) # 4326685768
lst1 = [1, 2, 4]
print(id(lst1)) # 4326684360
# 我们发现. 字符串的数据地址是⼀样的. ⽽ 列表的数据地址是不⼀样的.
tup = (1, 2)
tup1 = (1, 2)
print(id(tup))
print(id(tup1))
print(id("哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵"*100))
print(id("哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵"*100))
s1 = "00000000000000000000000000000000000000000哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵"
s2 = "00000000000000000000000000000000000000000哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵
呵呵"
print(id(s1))
print(id(s2))
print(s1 is s2)
a1 =
str("alexalexalex"+"abcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcd
ef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111a
bcdefgabcdef1111abcdefg")
print(id(a1))
a2 =
str("alexalexalex"+"abcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcd
ef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111abcdefgabcdef1111a
bcdefgabcdef1111abcdefg")
print(id(a2))
s1 = "@1 2 "
s2 = "@1 2 "
print(id(s1))
print(id(s2)) # 结果⼀致, 但是在终端中是不⼀致的. 所以在python中,命令⾏代码和py⽂
件中的代码运⾏的效果可能是不⼀样的

  

  s = "周杰伦"
# s1 = s
# print(id(s), id(s1)) # lst = [1, 4, 7]
# lst2 = lst
# lst.append("麻花藤")
# print(id(lst), id(lst2)) # print(id(lst), id(lst2))
#
# s1 = "alex"
# s2 = "alex"
# print(id(s1), id(s2)) # 内存地址是一样的
#
# lst1 = [1, 4, 7]
# lst2 = [1, 4, 7]
# lst1.append("马虎疼")
# print(lst1, lst2)
# print(id(lst1), id(lst2)) # 内存地址不一样 # a = 257
# b = 257
# print(id(a), id(b)) # a = "哈哈哈哈哈哈"
# b = "哈哈哈哈哈哈"
# print(a is b) #
# print(a == b) # a = [1, 4, 7]
# b = [1, 4, 7]
# print(a is b) # False 两个对象
# print(a == b) # True 内容一致 # a = (1, 8, 6)
# b = (1, 8, 6)
# print(a == b)
# print(a is b) # lst1 = ["周杰伦", 1, 2]
# lst2 = lst1
# print(lst1 is lst2) #
# print(lst1 == lst2)
a = 1024
b = 1024
print(a is b)
print(a == b)

小数据池

⼩数据池(常量池): 把我们使⽤过的值存储在⼩数据池中.供其他的变量使⽤.
⼩数据池给数字和字符串使⽤, 其他数据类型不存在.
对于数字: -5~256是会被加到⼩数据池中的. 每次使⽤都是同⼀个对象.
对于字符串:

  1. 如果是纯⽂字信息和下划线. 那么这个对象会被添加到⼩数据池
  2. 如果是带有特殊字符的. 那么不会被添加到⼩数据池. 每次都是新的
  3. 如果是单⼀字⺟*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加
  到⼩数据池中

注意(⼀般情况下): 在py⽂件中. 如果你只是单纯的定义⼀个字符串. 那么⼀般情况下都是会
被添加到⼩数据池中的. 我们可以这样认为: 在使⽤字符串的时候, python会帮我们把字符串
进⾏缓存, 在下次使⽤的时候直接指向这个字符串即可. 可以节省很多内存

说了这么多. 这个id()和is有什么关系呢. 注意. is⽐较的就是id()计算出来的结果. 由于id是帮我
们查看某数据(对象) 的内存地址. 那么is⽐较的就是数据(对象)的内存地址.
最终我们通过is可以查看两个变量使⽤的是否是同⼀个对象.

== 双等表⽰的是判断是否相等, 注意. 这个双等⽐较的是具体的值.⽽不是内存地址

s1 = "哈哈"
s2 = "哈哈"
print(s1 == s2) # True
print(s1 is s2) # True 原因是有⼩数据池的存在 导致两个变量指向的是同⼀个对象
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2) # True, 值是⼀样的
print(l1 is l2) # False, 值是假的

  编码的补充
1. python2中默认使⽤的是ASCII码. 所以不⽀持中⽂. 如果需要在Python2中更改编码.
  需要在⽂件的开始编写 :

  # -*- encoding:utf-8 -*-

2. python3中: 内存中使⽤的是unicode码

编码回顾:
1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂,
8个01代码, 8个bit, 1个byte
2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常⽤编码. 16个bit, 2个byte
3. UNICODE: 万国码, ⾥⾯包含了全世界所有国家⽂字的编码. 32个bit, 4个byte, 包含了
ASCII
4. UTF-8: 可变⻓度的万国码. 是unicode的⼀种实现. 最⼩字符占8位
1.英⽂: 8bit 1byte
2.欧洲⽂字:16bit 2byte
3.中⽂:24bit 3byte
综上, 除了ASCII码以外, 其他信息不能直接转换.
在python3的内存中. 在程序运⾏阶段. 使⽤的是unicode编码. 因为unicode是万国码. 什么内
容都可以进⾏显⽰. 那么在数据传输和存储的时候由于unicode⽐较浪费空间和资源. 需要把
unicode转存成UTF-8或者GBK进⾏存储. 怎么转换呢. 在python中可以把⽂字信息进⾏编码.
编码之后的内容就可以进⾏传输了. 编码之后的数据是bytes类型的数据.其实啊. 还是原来的
数据只是经过编码之后表现形式发⽣了改变⽽已

  ASCII 8bit 1byte   英文小写大写字母. 特殊字符. 数字
        GBK 16bit  2byte   中文 兼容ASCII
        UNICODE 32bit 4byte 万国码.  占空间  浪费
        UTF-8 unicode升级版, 英文 1byte, 中文 3byte
        传输过程中用: UTF-8或者GBK. UNICODE 浪费资源.
        内存中, 我们程序运行的过程中. 编码是unicode
        转换的时候. GBK不能和UTF-8互相转换.
        在程序中.字符串可以编码成bytes类型的数据
        编码encode()
        编码之后的结果和原来的结果其实是一样的东西. 只是看着不一样

bytes的表现形式:
1. 英⽂ b'alex' 英⽂的表现形式和字符串没什么两样
2. 中⽂ b'\xe4\xb8\xad' 这是⼀个汉字的UTF-8的bytes表现形式

字符串在传输时转化成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个字节

is, ==, id, encode,的更多相关文章

  1. python学习日记(python2/3区别补充,is / id/ encode str,bytes)

    python2和python3区别 print python2中,print 是语句 :用法 ---->print '***' python3中,print 是函数:用法----->pri ...

  2. node_nibbler:自定义Base32/base64 encode/decode库

    https://github.com/mattrobenolt/node_nibbler 可以将本源码复制到自己需要的JS文件中,比如下面这个文件,一个基于BASE64加密请求参数的REST工具: [ ...

  3. 安卓自动化测试工具MonkeyRunner之使用ID进行参数化,以及List选择某项和弹出框点击确定的写法

    一.List选择某项的操作步骤: 1.通过父结点得出列表各子项 2.将选择项的文本与列表中的子项进行比较 3.计算出选择项的坐标位置 截取实例: from com.android.monkeyrunn ...

  4. doT.js详细介绍

    doT.js详细介绍   doT.js特点是快,小,无依赖其他插件. 官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolati ...

  5. 百度网盘爬虫Python

    ": for i in range((shares["total_count"]-1)/ONESHAREPAGE): try: dbcurr.execute('INSER ...

  6. C#生成二维码示例

    其实现在二维码越来越流行,网上也有很多生成二维码的类库.写一下WEB生成二维码注意事项吧! 目前C#生成二维码大部分都是使用ThoughtWorks.QRCode或者ZXing类库生成,主要说一下Th ...

  7. 模板引擎doT.js介绍及如何判断对象为空、如何嵌套循环···

    doT.js 灵感来源于搜寻基于 V8 和 Node.js ,强调性能,最快速最简洁的 JavaScript 模板函数 引入 javascript 文件: <script type=" ...

  8. Android二维码开源项目zxing编译

    ZXing是一个开放源代码的,用Java实现的多种格式的1D/2D条码图像处理库,它包括了联系到其它语言的port.Zxing能够实现使用手机的内置的摄像头完毕条形码的扫描及解码.该项目可实现的条形码 ...

  9. doT.js实例详解

    doT.js详细介绍 doT.js特点是快,小,无依赖其他插件.官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolation{ ...

随机推荐

  1. Seq2Seq和Attention机制入门介绍

    1.Sequence Generation 1.1.引入 在循环神经网络(RNN)入门详细介绍一文中,我们简单介绍了Seq2Seq,我们在这里展开一下 一个句子是由 characters(字) 或 w ...

  2. LoadRunner内部结构(转)

    LoadRunner内部结构 1,            被测系统是由驱动进程mdrv.exe(多线程驱动的进程)和r3vuser.exe来产生压力的,其中r3vuser.exe仿真应用程序的客户端, ...

  3. VS 2017产品秘钥

    Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  4. /usr/bin/python^M: bad interpreter: No such file or dir解决办法

    Linux直接./xx.py执行python脚本时报错 修改脚本文件编码 $vi xx.py $set ff=unix $:wq

  5. qt ui界面控件布局设计

    1.布局控件简介: 水平布局,里面的控件将水平展示,布局器里面的控件大小若没有固定,其大小将随着布局的大小而自动拉伸.可以通过设置其左(layoutLeftMargin).上(layoutTopMar ...

  6. rpm相关

    rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM ...

  7. ubuntu16.04安装docker11.09

    1.    安装Docker 操作系统 ubuntu16.04 1.1.   配置源文件 $sudo apt-get update #允许 apt 命令 HTTPS 访问 Docker 源 $sudo ...

  8. koa2入门笔记

    [TOC] 一 什么是koa koa是基于nodejs的web框架, 是一个中间件框架. 二 中间件 Koa 中间件是简单的函数,它是带有 (ctx, next)形参 的函数. 可以采用两种不同的方法 ...

  9. Linux上部署Springboot相关命令

    ps -ef|grep java 看有关java的进程 ps -ef是显示所有进程信息 后面那个grep是匹配的意思 kill -9 123123 213231 后面两个数字是两个进程的进程号pid, ...

  10. 18.synchronized

    同步的前提:  必须要有两个或者两个以上的线程  必须是多个线程使用同一个锁  必须保证同步中只能有一个线程在运行  好处:解决了多线程的安全问题  弊端:多个线程需要判断锁,较为消耗资源.抢锁的资源 ...