python集合,深浅copy,数据类型的补充
#数据类型的补充
is ==
is 判断内存id是否相同。
== 判断的是数值是否相同。
id 测试他的内存地址。
小数据池:
int:-5~256
str:只包含数字或者字母元素。
单个字母*int(20以内)存在小数据池的概念。
1,元组
集合是一个可变的数据类型,他是以{}的形式存在的,空集合set(),
要求里面的元素时不可变的,集合是无序的,不能重复的。
tu1 = ('lao')#<class 'str'>
tu2 = ('lao',)#<class 'tuple'>
print(tu1, type(tu1))
print(tu2, type(tu2))
tu1 = (1)#<class 'int'>
tu2 = (1,)#<class 'tuple'>
print(tu1, type(tu1))
print(tu2, type(tu2))
tu1 = ([1, 2, 3])#<class 'list'>
tu2 = ([1, 2, 3],)#<class 'tuple'>
print(tu1, type(tu1))
print(tu2, type(tu2))
元祖里面如果只有一个元素,没有逗号,则该数据类型与元素的数据类型相同。
# list
# 删除奇数索引的列表元素
# 方法一
# l=[111,222,333,444,555,]
# del l [1::2]
# print(l)
# 方法二
# for index in range(len(l)-1,-1,-1):# 在循环一个列表是,最好不要改变列表的大小,会影响最后结果。一定要注意range的范围。
# if index % 2 == 1:
# # l.pop(index)
# del l[index]
# print(l)
# dic
# dic=dict.fromkeys
# dic = dict.fromkeys('abc',666)
# print(dic)
# dic = dict.fromkeys([11,22,33],666)
# print(dic)
# dic = dict.fromkeys([1,2,3,4],[])?
# dic[1].append(666)
# print(dic)
#{1: [666], 2: [666], 3: [666], 4: [666]} ,[1,2,3,4]对应的值内存地址相同,改变了一个,其他的也跟着改变。
dic = {'k1': 'v1', 'k2': 'v2','k3': 'v3','name': 'alex','age':18}
l = []
for key in dic.keys():#for key in dic.keys()==for i in dic: 都是把字典的键打印出来
if 'k' in key:
l.append(key)
l=[]
for i in dic:
if 'k' in i:
l.append(i)
print(l)
print(l)
for i in l:#在循环可迭代对象期间,不能改变其长度,就重新生成一个迭代对象,
# 在新的迭代对象里,改变迭代对象的长度。
dic.pop(i)
print(dic)
数据类型的转化
'''
str ---> list split
list --> str join
tuple ---> list
tu1 = (1, 2, 3)
l1 = list(tu1)
print(l1)
tu2 = tuple(l1)
print(tu2)
dic ----> list list(dic)(列表中的元素只有key)
'''
# dic = {'k1': 'v1', 'k2': 'v2','k3': 'v3',}
# l1 = list(dic)
# print(l1)
# print(list(dic.keys()))
# print(list(dic.values()))
# print(list(dic.items()))
# 0, '', [], () {} ---> bool 都是Fasle
# print(bool([0]))#True
集合
集合是一个可变的数据类型,他是以{}的形式存在的,空集合set(),
要求里面的元素时不可变的,集合是无序的,不能重复的。
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据之前的交集、差集、并集等关系。
set1 = {1, 2, 3, 'abc', (1,2,3), True, }
print(set1,type(set1))
列表的去重
l1 = [11, 11, 22, 22, 33, 33, 33, 44]
l2=list(set(l1))
l2.sort()#从小到大
l2.sort(reverse=True)#从大到小
print(l2)
set1 = {'alex', 'WuSir', 'RiTiAn', 'egon', 'barry'}
增
set1.add('hshs')
print(set1)
set1.update([111,222,333])#迭代着添加
print(set1)
删
remove按元素删除
set1.remove('jkj')
print(set1)
随机删除,有返回值 pop
set1.pop()
print(set1.pop())#有返回值
print(set1)
clear()清空
set1.clear()
print(set1)
del 删除
del set1
print(set1)
查
for i in set1:
print(i)
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
交集 & intersection
set3=set1 & set2
set4=set1.intersection(set2)
print(set3)
print(set4)
并集| union
print(set1 | set2)
print(set1.union(set2))
差集 - difference
print(set1-set2)#set1独有
print(set2.difference(set1))#set2独有
反交集 ^ symmetric_difference
print(set1^set2)
print(set1.symmetric_difference(set2))
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5, 6}
< issubset 子集
print(set1 < set2)#True set1是set2的子集
print(set1.issubset(set2))
> issuperset 超级
print(set2 > set1)#True set2是set1的超集
print(set2.issuperset(set1))
frozenset不可变集合,让集合变成不可变类型
set1 = frozenset({1, 2, 3, 'alex'})#冻结,{1,2,3,'alex'}不可变
print(set1,type(set1))
l1 = [1, 2, 3]
l2 = l1
l3 = l2
l3.append(666)
print(l1, l2, l3)#[1, 2, 3, 666] [1, 2, 3, 666] [1, 2, 3, 666],l1,l2,l3公用一个内存空间。
对于赋值运算来说,指向的都是同一个内存地址,一变都变。
深浅copy
浅copy
l1 = [11, 22, 33]#浅copy只有一层时,完全独立,地址不同
l2=l1.copy()
l1.append(666)
print(l1,id(l1))
print(l2,id(l2))
l1 = [11, 22, ['barry', [55, 66]], [11, 22]]
l2 = l1.copy()
l1[2].append('a')
print(l1,id(l1))
print(l2,id(l2)) # 地址不同
print(l1, id(l1[-1]))
print(l2, id(l2[-1])) # 地址相同
对于浅copy来说,第一层是创建新的内存地址,从第二层开始,
两者指向的是同一个内存地址。所以从第二层起,要保持一致性。
深copy
import copy
l1 = [11, 22, 33]
l2=copy.deepcopy(l1)
l1.append(666)
print(l1,id(l1))
print(l2,id(l2))
#
import copy
l1 = [11, 22, ['barry']]
l2=copy.deepcopy(l1)
l2[2].append('a')#深copy 完全独立。
print(l1,id(l1))
print(l2,id(l2))
s1 = 'a'#字符串有小数据池,id相同
s2 = 'a'
print(id(s1),id(s2))
l1 = [1, 2, 3]
l2 = [1, 2, 3]
l1.append(666)
print(l1,id(l1))
print(l2,id(l2))
对于切片来说,这是浅copy。
l1 = [1, 2, 3, 4, 5, 6, [11,22]]
l2 = l1[:]
l1.append(666)
print(l1, l2)
l1[-2].append(666)
print(l1, l2)