set 集合
列表、元组、字符串去重
集合中的元素必须是可哈希(hash)的,但set本身是不可哈希的可变的(有增删改查)、不重复、无序的
创建一个空集合 s = set{}
1、关系型数据的交集,并机,差集,子集
set1 = {1, 'alex', Fslse, (1,2,3)}
2、列表、元组、字符串 去重,
list 1= [1, 1, 1, 3,4 ,4 ,43, 3,5,6]
set = set(list1) <---转换成集合就会去重,但返回集合类型
list2 = list(set) 强制转换回成list列表型
frozenset() 冻结的集合. 不可变的. 可哈希的
set的方法:很少用
set.pop() 或 pop(set) 随机删除一个元素
set.clear() 清空集合 print(set)
set.add('666') print(set) 增加一个元素
set.update() 迭代更新插入
set.remove()
集合方法
| 并集 多个集合元素合一起并去重
& 交集 取共有部分
- 差集 pythons - linuxs
小数据池,在一定情况下出现内存共享,为了节约内存(只有int 和 str 才有的,在字典中也会出现),解决小数据池的问题,通常要想到用深浅copy
https://www.cnblogs.com/Mr-wangxd/p/9407164.html 内有is ==的例子,所有操作在终端进行,pycharm会改变结果
is 和 ==的区别
id() 打印数据的地址
a = 'hello'
b = 'hello'
print(a == b) 返回True 比较的是数值
print(a is b) 返回False 比较的是地址,判断是否是同一个对象,看地址方法 print(id(a), id(b))
字符串中如果有特殊字符他们的内存地址就不一样
注意: pycharm是个坑, 一个py文件中所有相同的字符串 一般都是使用一样的内存地址
int类型中 -5 ~ 256之间的数 相同的数全都指向一个内存空间。
字符串中单个*20以内他们的内存地址一样,单个*21以上内存地址不一致
a = 'A' * 20 ; b = 'A' * 20 a is b ==>True
str类型 单个字符乘以20以内的数字都在同一内存地址;只要字符串含有数字那就不共用内存,不会出现小数据池
a = [1, 2, 3] b = a c = b print(a is c) ==>True 如果c改变 a也会改变 很坑!!! a = [1, 2, 3] c = [1, 2, 3] print(a is c) ==>True #赋值运算他们共用一个列表 a = [1, 2, 3] b = a a.append(666) print(a, b) 输出:a==[1, 2, 2, 777] b==[1, 2, 2, 777]
深浅copy 无论深浅拷贝复制后的地址与源地址不同
浅copy 从第二层开始以后共用内存,第一层各自用各自的
浅拷贝两种方式
1、 list2 = list1[:]
2、#.copy() 作用域 作用??????????
list1 = [1, 2, 3, [4, 5]] list2 = list1.copy() list1[-1].append(666) print(list1, list2) #返回[1, 2, 3, [4, 5], 666] [1, 2, 3, [4, 5]] 返回是不同的,说明不共用同一段内存 list[-1].append(666) print(list1, list2) # 返回 [1, 2, 3, [4, 5, 666]] [1, 2, 3, [4, 5, 666]] 返回是相同的 说明从第二层以后共用同一段内存
深copy 需要导入模块import copy, 所有都不共用内存,无论几层都是各自用各自的内存
#deepcopy() 作用域 作用?
import copy
list1 = [1, 2, 3, [4, 5]] list2 = copy.deepcopy(list1) list1[-1].append(666) print(list1, list2) list[-1].append(666) print(list1, list2) #所有返回结果都是不同的