Python自学之路之day06-基本数据集合

一、集合

set集合是python的一个基本数据类型. ⼀般不是很常⽤. set中的元素是不重复的.⽆序的.⾥面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也⽤{}表⽰。

1、 set集合中的元素必须是可hash的, 但是set本身是不可hash的. set是可变的

## 不合法集合
set1 = {'1','abc',2,True,[1,2,3]} # 报错
set2 = {'1','tchua',2,True,{1:2}}  # 报错
set3 = {'1','tchua',2,True,(1,2,[2,3,4])}  # 报错

2、集合是无序且不能重复的

s1 = {1,2,2,"huahua","huahua"}
print(s1)

打印结果:
{1, 2, 'huahua'}

3、集合常用操作

# 增加
s1 = {"tchua","流浪",1}
s1.add("光辉")
print(s1)

## 重复内容不会添加到集合中
s1.add("流浪")

## 迭代增加
s1 = {"tchua","流浪",1}
s1.update("光辉")
打印结果:
{1, '', 'tchua', '流浪', ''}


#
## pop 返回删除的值
s1 = {"tchua","流浪",1}
s2 = s1.pop()
print(s1)
print(s2)

## remove 直接删除元素,元素不存在,则报错
s1 = {"tchua","流浪",1}
s1.remove("tchua")
print(s1)

## clear 清空集合
s1 = {"tchua","流浪",1}
s1.clear()
print(s1)

打印结果:
set()

# 修改
 set集合中的数据没有索引. 也没有办法去定位⼀一个元素. 所以没有办法进⾏行行直接修改,如果想要修改,可以采用先删除后添加的⽅式来完成修改操作

## 流浪修改为光辉

s1 = {"tchua","流浪",1}
s1.remove("流浪")
s1.add("光辉")
print(s1)

 4、集合运算

# 交集
s1 = {"刘能", "赵四", "李珊"}
s2 = {"刘科⻓长", "冯乡长", "李珊"}
print(s1 & s2)
print(s1.intersection(s2))

# 并集
s1 = {"刘能", "赵四", "李珊"}
s2 = {"刘科⻓长", "冯乡长", "李珊"}
print(s1 | s2)
print(s1.union(s2))

# 差集
s1 = {"刘能", "赵四", "李珊"}
s2 = {"刘科⻓长", "冯乡长", "李珊"}
print(s1 - s2)
print(s1.difference(s2))

# 子集 返回True或者False
print(s1 < s2)  
print(s1.issubset(s2))

# 超集 返回True或者False
print(s1 > s2)
print(s1.issuperset(s2))

 二、深浅COPY

lst1 = ["流浪","光辉","德玛"]
lst2 = lst1
print(lst1)
print(lst2)
打印结果:
['流浪', '光辉', '德玛']
['流浪', '光辉', '德玛']

lst1.append("皇子")
print(lst1)
print(lst2)
打印结果:
['流浪', '光辉', '德玛', '皇子']
['流浪', '光辉', '德玛', '皇子']

总结:于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是一样的. lst1改变了, lst2也发⽣生了改变

 1、浅拷贝

lst1 = ["流浪","光辉","德玛","狐狸"]
lst2 = lst1.copy()
print("第一次打印:",lst1,lst2)

lst1.append("亚索")

print("第二次打印:",lst1,lst2)

打印结果:
第一次打印: ['流浪', '光辉', '德玛', '狐狸'] ['流浪', '光辉', '德玛', '狐狸']
第二次打印: ['流浪', '光辉', '德玛', '狐狸', '亚索'] ['流浪', '光辉', '德玛', '狐狸']

结论:
我们发现第一次lst1与lst2的值是一样的,但是内存地址却不一样,当我们修改lst1时,并不会影响lst2。浅copy会重新开辟一块内存地址,与之前内容虽然一样,但是内存地址指向不一样,所以不相互影响。

lst1 = ["流浪","光辉","德玛",["法师","中路"]]
lst2 = lst1.copy()
lst1[3].append("AD")
print(lst1)
print(lst2)
print(id(lst1[3]),id(lst2[3]))

打印结果:
['流浪', '光辉', '德玛', ['法师', '中路', 'AD']]
['流浪', '光辉', '德玛', ['法师', '中路', 'AD']]
2366773349256 2366773349256

结论:
当有多层时,浅copy只会copy第一层,内层的内容指向的内存地址一样,所以修改其中一个,另一个也会变,这就是浅copy的特性。

 2、深拷贝

深copy需要借助copy模块

import copy

lst1 = ["流浪","光辉","德玛",["法师","中路"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("AD")
print(lst1)
print(lst2)
print(id(lst1[3]),id(lst2[3]))

打印结果:
['流浪', '光辉', '德玛', ['法师', '中路', 'AD']]
['流浪', '光辉', '德玛', ['法师', '中路']]
2454014970440 2454014971400

结论:
可以看到,lst1与lst2值和内存地址都不一样了。深度拷贝就是把元素内部的元素完全进⾏拷⻉复制. 不会产⽣一个改变另⼀个跟着改变的问题

 

posted @ 2019-08-13 16:27  小哥boy  阅读(51)  评论(0)    收藏  举报