从内存的角度出发解决小数据池的问题

is 和 == 的区别:

  is比较的两端的内存地址

  == 比较的是两端的值

小数据池的概念:

把我们通常使用过的值存储在小数据池中,供其它的变量使用,小数据池给数字和字符串使用,其他数据类型不存在

小数据池给数字和字符串使用

对于字符串:

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

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

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

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

 is 比较的就是id()计算出来的结果, is比较的就是数据的内存地址

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

 

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

 

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个字节.

 

基础数据类型补充

join ------------------->

li = ["李李嘉诚", "麻花藤", "⻩黄海海峰", "刘嘉玲"]

s = "_".join(li)

print(s)

循环删除列表中的元素:------------------>会删不干净

这是因为for的运行过程,会有一个指针来记录当前循环的元素是哪一个,一开始这个指针指向第0个,然后获取到0个,然后删除,这个时候,原来是第一个的元素会自动变成第0个,然后指针向后移动一次,指向1元素,这时原来的1已经变成了0 ,也就不会被删除了

⽤用另⼀一个列列表来记录你要删除的内容. 然后循环删除

li = [11, 22, 33, 44]

del_li = []

for e in li:

  del_li.append(e)

for e in del_li:

  li.remove(e)

print(li)

注意: 由于删除元素会导致元素的索引发生改变,所以容易出现问题,尽量不要再循环中直接去删除元素,可以把要删除的元素添加到另一个集合中然后批量删除

dict中的fromkey(),可以帮我们通过list来创建一个dict

前⾯面列列表中的每⼀一项都会作为key, 后⾯面列列表中的内容作为value. ⽣生成dict
好了了. 注意:

代码中只是更改了jay那个列表,但是由于jay和JJ用的是同一个列表,所以前面那个改了,后面那个也会跟着改

dict中的元素在迭代过程中是不允许进行删除的

那怎么办呢? 把药删除的元素暂时先保存在一个list中,然后循环list,再删除

 

类型转换:

元组==>列表    list(tuple)

列表==>元组    tuple(list)

list==> str    str.join(list)

str ==> list     str.split()

转换成False的数据:

0,'',None,[],(),{},set() ==>False    

换言之,凡是一切能代表空的,无的都是False

 

posted @ 2018-07-10 15:12  ALADL  阅读(140)  评论(0编辑  收藏  举报