集合 小数据池 深浅拷贝

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)                      #所有返回结果都是不同的

猜你喜欢

转载自www.cnblogs.com/Mr-wangxd/p/9418693.html