is, ==, id, encode,

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⽂
件中的代码运⾏的效果可能是不⼀样的

  

 1  s = "周杰伦"
 2 # s1 = s
 3 # print(id(s), id(s1))
 4 
 5 # lst = [1, 4, 7]
 6 # lst2 = lst
 7 # lst.append("麻花藤")
 8 # print(id(lst), id(lst2))
 9 
10 # print(id(lst), id(lst2))
11 #
12 # s1 = "alex"
13 # s2 = "alex"
14 # print(id(s1), id(s2)) # 内存地址是一样的
15 #
16 # lst1 = [1, 4, 7]
17 # lst2 = [1, 4, 7]
18 # lst1.append("马虎疼")
19 # print(lst1, lst2)
20 # print(id(lst1), id(lst2))   # 内存地址不一样
21 
22 
23 # a = 257
24 # b = 257
25 # print(id(a), id(b))
26 
27 # a = "哈哈哈哈哈哈"
28 # b = "哈哈哈哈哈哈"
29 # print(a is b)   #
30 # print(a == b)
31 
32 # a = [1, 4, 7]
33 # b = [1, 4, 7]
34 # print(a is b)   # False 两个对象
35 # print(a == b)   # True  内容一致
36 
37 # a = (1, 8, 6)
38 # b = (1, 8, 6)
39 # print(a == b)
40 # print(a is b)
41 
42 # lst1 = ["周杰伦", 1, 2]
43 # lst2 = lst1
44 # print(lst1 is lst2) #
45 # print(lst1 == lst2)
46 a = 1024
47 b = 1024
48 print(a is b)
49 print(a == b)
View Code

小数据池

⼩数据池(常量池): 把我们使⽤过的值存储在⼩数据池中.供其他的变量使⽤.
⼩数据池给数字和字符串使⽤, 其他数据类型不存在.
对于数字: -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 : 最早的编码. ⼤写字⺟, 字⺟, 数字, 特殊字符. 没有中⽂,
801代码, 8bit, 1byte
2. GBK: 中⽂国标, ⾯包含ASCII编码和中⽂常⽤编码. 16bit, 2byte
3. UNICODE: , ⾯包含全世界所有国家⽂字的编码. 32bit, 4byte, 包含
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'xe4xb8xad' 这是⼀个字的UTF-8bytes表现形式

字符串在传输时转化成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'xe4xb8xad'
b'xd6xd0

  : ⽂编码后的结果和字符串⼀. 中⽂编码后的结果根据编码的不同. 编码结果
也不同. 我们能看到. ⼀个中⽂的UTF-8编码是3个字节. ⼀个GBK的中⽂编码是2个字节

原文地址:https://www.cnblogs.com/liuye1990/p/9145378.html