从内存的角度出发解决小数据池的问题
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