编码以及知识点补充

主要内容:

  1,is和==的区别

  2,编码的问题

 

一,is和==的区别

1,id( )

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

s = "alex"
print(id(s))  # 2332857447176
s1 = "alex"
print(id(s1))  # 2332857447176

lst = [1,2,3]
print(id(lst))  # 1587609412552
lst1 = [1,2,3]
print(id(lst1))  # 1587610244616

 我们发现,字符串的数据地址是一样的,而,列表的数据地址是不一样的.

原因是:小数据池(常量池):把我们使用过的值存储在小数据池中,供其它的变量使用.

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

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

对于字符串:

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

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

  3,如果是单一的字母*n的情况,a*20,在20个单位内是可以的,超过20个单位就不会添加

到小数池中

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

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

s1 = 'alex'
s2 = 'alex'
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

 总结:

  is比较的是地址

  == 比较的是值

二,编码的补充

python2中默认使用的是Ascii码,所以不支持中文,如果需要在python2中更改编码,需要在文件开始编写:

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

 python3中:内存中使用的是unicode码

补充:

  在python3中的内存中,在程序运行阶段,使用的是unicode编码,因为unicode是万国码,是么内容都可以进行显示,那么数据传输和存储的时候由于Unicode比较浪费空间和资源,需要把unicode转存成utf-8或者gbk进行存储,编码之后的数据室bytes类型的数据,其实,还是原来的数据只是经过编码之后表现形式发成了改变而已.

bytes的表现形式:

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

  2,中文 b'\xe4\xb8\xad' 这就是一个汉字的utf-8的bytes表现形式

s = 'alex'
print(s.encode('utf-8'))
print(s.encode('gbk'))  # b'alex'

s = '中'
print(s.encode('utf-8'))  # b'\xe4\xb8\xad'
print(s.encode('gbk'))  # b'\xd6\xd0'

 记住:英文编码之后的结果和源字符串一致,中文编码之后的结果根据编码的不同.编码结果也不同.我们能看到.一个中文的utf-8编码是3个字节,一个gbk的中文编码是2个字节.

 

posted @ 2018-06-06 14:52  猴里吧唧  阅读(102)  评论(0)    收藏  举报