set集合, 小数据池
-
is 判断的是内存地址是否相同
-
== 判断值
-
# id 身份证号(获取ip地址)
# i = 100
# s = 'alex'
# print(id(i))
# print(id(s))
# == 比较的是两边的值是否相等
# l1 = [1, 2, 3]
# l2 = [1, 2, 3]
# print(l1 == l2)
# s1 = 'alex'
# s2 = 'alex '
# print(s1 == s2)
# is 判断的是内存地址是否相同
# l1 = [1, 2, 3]
# l2 = [1, 2, 3]
# print(id(l1))
# print(id(l2))
# print(l1 is l2)
s1 = 'alex'
s2 = 'alex'
print(id(s1))
print(id(s2))
print(s1 is s2)
# id 相同,值一定相同
# 值相同,id不一定相同
2.代码块
-
代码块: 我们所有的代码都需要依赖代码块来执行
-
一个文件就是代码块
-
在交互式命令下一行就是一个代码块
3.两个机制: 同一代码块下, 有一个机制, 不同的代码块下,遵循另外一个机制
4.同一个代码块下的缓存机制
-
前提条件: 用一个代码块内
-
机制内容: python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, 满足缓存机制则他们在内存中只存在一个,即:id相同。
-
适用机制: int str bool
-
具体细则: 所有的数字, bool, 几乎所有的字符串
-
优点: 提升性能, 节省内存
5.不同代码块下的缓存机制: 小数据池
-
小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等
-
前提条件: 不同代码块内
-
机制内容: Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个
-
适用的对象: int bool str
-
具体细则: -5~256数字, bool, 满足规则的字符串
-
优点提升性能, 节省内存
6.python基础数据类型之: 集合set, 容器型的数据类型,它要求里面是不可变(可哈希)的数据类型, 但它本身是可变的数据类型.集合是无序的 {}
-
集合的作用:
-
列表的去重
-
关系测试: 交集, 并集, 差集,...
-
# 集合的创建 字典是无序的
# set1 = set({1, 2, '哈哈'})
# set1 = {1, 2, 3, 'alex', '悟空'}
# print(set1)
# 空集合
# print({}, type({})) # 这是空字典
# set1 = set() # set() 就表示一个空的集合
# print(type(set1))
# 集合的增加
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.add('悟空')
# print(set1)
# 集合的迭代增加update
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.update('123')
# print(set1)
# 集合的删除
# set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
# set1.remove('alex') # 指定删除
# print(set1)
# set1.pop() # 随机删除一个
# print(set1)
# set1.clear() # 清空集合
# print(set1)
# del set1 # 直接删除集合
# print(set1)
# 集合的其他操作:
# 4.1 交集 & 或者 intersection
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 & set2)
# print(set1.intersection(set2))
# 4.2 并集。(| 或者 union)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 | set2)
# print(set1.union(set2))
# 4.3 差集。(- 或者 difference)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 - set2)
# print(set1.difference(set2))
# 4.4反交集。 (^ 或者 symmetric_difference)
# set1 = {1, 2, 3, 4, 5}
# set2 = {4, 5, 6, 7, 8}
# print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 4.5子集与超集 < > issubset, issuperset
# set1 = {1, 2, 3}
# set2 = {1, 2, 3, 7, 8}
# print(set1 < set2) # 结果为true, 表示set1是set2的子集
# print(set1.issubset(set2)) # 和上面是相同的
# print(set1 > set2) # 结果为false 表示set2是set1的超集
# print(set1.issuperset(set2)) # 和上面的是一样的
# frozenset不可变集合,让集合变成不可变类型。
# s = frozenset('barry')
# print(s, type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
# enumerate:枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串)
# enumerate 将其组成一个索引序列,利用它可以同时获得索引和值。
# li = [1, 2, 3, 4, 'alex']
# for i in enumerate(li):
# print(i)