set集合与深浅拷贝

时间:2022-06-19 19:51:29

一.set集合

   set集合的元素是不重复的,无序的,元素必须是可哈希的(int,str,tuple,bool).也是用{}表示

set = {"4",4,[1,2,3]}                                  #会报错
set = {"2","dsjoijfj",897,{"回话":"看看"}}      #会报错

set = {1,6,"回话",6,8,6,"呵呵"}        #set集合可以去重复
print(set)


结果:
{1, '回话', 6, 8, '呵呵'}

      去重复

可以把列表转换成集合进行去重复,

lst = [1,5,6,8,7,2,5,6,9,8,4,5,2]
s = set(lst)                                 #列表转换成集合
print(s)
lst = list(s)                                  #集合转换成列表
print(lst)


结果:
{1, 2, 4, 5, 6, 7, 8, 9}
[1, 2, 4, 5, 6, 7, 8, 9]

     集合本身是可变的数据类型,不可哈希,有增删改查操作,我们可以用   frozenset(冻结型)来保存数据.

二.深浅拷贝

     1.浅拷贝

lst = ["","","",""]
lst1 = lst                              #==赋值操作没有创建对象,所以只有一个列表,内存地址一样.
lst.append("")
print(lst)
print(lst1)


结果:
['', '', '', '', '']
['', '', '', '', '']

          浅拷贝,只拷贝第一层内容,方法: [:]     copy()  

lst = ["","","",""]
lst1 = lst.copy()
lst.append("回话")
print(lst)
print(lst1)
print(id(lst))
print(id(lst1))

答案:
['', '', '', '', '回话']
['', '', '', '']
42333256
42333960

#两个lst完全不一样,内存地址和内容页不一样
lst = ["","","","",["","",""]]
lst1 = lst.copy()
lst[4].append("")
print(lst)
print(lst1)
print(id(lst[4]))                   #lst和lst1中的第四个元素比较,内存一样
print(id(lst1[4]))

答案:
['', '', '', '', ['', '', '', '']]
['', '', '', '', ['', '', '', '']]

38728776
38728776


#浅拷贝,只会拷贝第一层,第二层内容不会拷贝.

 

       2.深拷贝:把拷贝对象内部的内容全部拷贝一份,引入copy模块,  deepcopy().

import copy                                        #插入copy模块
lst = ["","","","",["","",""]]
lst1 = copy.deepcopy(lst)
lst[4].append("")
print(lst)
print(lst1)
print(id(lst[4]))
print(id(lst1[4]))


结果:
['', '', '', '', ['', '', '', '']]
['', '', '', '', ['', '', '']]

42532680
42575112

           都不一样了,深度拷贝,把元素内部的元素进行拷贝复制,不会产生一个改变另一个也改变的问题.