python修炼之路-day6

一、is 和 == 的区别

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

1 a = "刀下生,刀下死"
2 b = "刀下生,刀下死"
3 print(id(a))
4 print(id(b))

>>>>>>>>>1654269828768
>>>>>>>>>1654269828768

>>>>>>>>>两个字符串地址相同

1 a = 123

2 b = 123

3 print(id(a),id(b)) 

>>>>>>>>>140708405633888 140708405633888

>>>>>>>>>两个数字地址也相同

1 a = ['yangxianqiang', 'pandeyong', 'hashiqi']
2 b = ['yangxianqiang', 'pandeyong', 'hashiqi']
3 print(id(a), id(b))

>>>>>>>>>2477147120200     2477147120264

>>>>>>>>>两个列表地址不同

1 a = ('abc', 2, 3, 4)
2 b = ('abc', 2, 3, 4)
3 print(id(a), id(b))

>>>>>>>>>2920342876392 2920342876392

>>>>>>>>>两个元组地址也相同

1 a = {1: 'xiazi', 2: 'yasuo', 3: 'feizi'}
2 b = {1: 'xiazi', 2: 'yasuo', 3: 'feizi'}
3 print(id(a), id(b))

>>>>>>>>>>2244009621904 2244009621976

>>>>>>>>>>两个字典地址也不相同

》》》》》》结论(仅供参考)

    小数据池(常量池): 把我们使用过的值存储在⼩小数据池中.供其他的变量使用.

    小数据池给数字和字符串使用, 其他数据类型不存在.

    对于数字: -5~256是会被加到小数据池中的. 每次使用都是同一个对象.

    对于字符串:

      1. 如果是纯文字信息和下划线. 那么这个对象会被添加到小数据池

      2. 如果是带有特殊字符的. 那么不会被添加到小数据池. 每次都是新的

      3. 如果是单一字母*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加 到小数据池中

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

is :  is比较的就是id()计算出来的结果. 由于id是帮我 们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址.

== : 双等表示的是判断是否相等, 注意. 这个双等比较的是具体的值.而不是内存地址

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

>>>>>>>>>>True

>>>>>>>>>>True

>>>>>>>>>>False

总结:    

  is 比较的是地址   

  == 比较的是值

二、编码的补充

  1.编码回顾:

      ASCII  :  英文   8bit    1byte

      GBK :   中文    16bit   2byte

      Unicode :  万国码  32bit  4byte

      utf-8 : 英文  8bit   1byte

         欧洲   16bit  2byte

         中文   24bit  3byte

  2.bytes的表现形式:

    1) : 英文   b'alex'  英文的表现形式和字符串没什么两样

    2) : 中文   b'\xe4\xb8\xad' 这是一个汉字的UTF-8的bytes表现形式

  3.编码 :  字符串在传输时转化成bytes=> encode(字符集)来完成

1 s = "alex"
2 print(s.encode("utf-8"))    # 将字符串编码成UTF-8
3 print(s.encode("GBK"))  # 将字符串编码成GBK

>>>>>>>>>>b'alex'

>>>>>>>>>>b'alex'

1 s = ""
2 print(s.encode("UTF-8"))    # 中文编码成UTF-8
3 print(s.encode("GBK"))  # 中文编码成GBK

>>>>>>>>>>b'\xe4\xb8\xad'

>>>>>>>>>>b'\xd6\xd0'

  4.解码 :  我们可以使用decode()来进行解码操作. 把bytes类型的数据还原回我们熟悉的字符串

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

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

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

猜你喜欢

转载自www.cnblogs.com/child-king/p/9286285.html