3.26 集合以及深浅copy

集合与深浅拷贝

 

集合

 

set集合数据类型:无序、不重复,里面的元素是可哈希(str、int、tuple、bool)的,集合本身不可哈希,不可作为字典的键。。。

  • 作用

    • 去重
    • 判断数据关系  

 

  • 集合的增删查

      1. set.add()

      2. set.update()集合的迭代添加      

      1. set.remove() 按元素删

      2. set.pop()有返回值,返回被删除的元素   

      3. set.clear():空集合表示:set()
      4. del set
      1. 只有for循环查阅 

 

  • 集合的交集、并集

    • 交集

        1. set1 & set2

        2. set1.intersection(set2)

    • 反交集

      1. set1 ^ set2

      2. set1.symmetric_difference(set2)     

    • 并集

      1. set1 | set2

      2. set1.union(set2)

    • 差集

      •  set1 - set2    

    • 子集与超集

      •  set1.issubset(set2):判断set1是否是set2的子集;

      •    set2.issuperset(set1): 判断set2是否是set1的超集;

    • frozenset

      • frozenset是不可变类型,属于可哈希。可以做字典的键。。                  

1 {'a': 'alex', 'b': 'alex', 'c': 'alex'}
2 {1: [], 2: [], 3: []}
3 {1: ['老男孩'], 2: ['老男孩'], 3: ['老男孩']}
frozenset({'barry', 'wusir'}) <class 'frozenset'>    ####   class(frozenset)不可变  可哈希

 深浅copy

    • copy:不同于赋值运算,不是在内存中指向一个内存,而是在内存中重新开辟了一个新的内存空间。而对于赋值运算,指向的是内存中的同一位置。

 

 

 

    • 浅copy

        • 第一层创建的是一个新内存空间,从二层开始,使用的是同一个内存地址。也就是只copy了一层新的关系。所以说对于第二层以及更深的层次来说,保持一致性。

1 l1 = [1,2,[1,2,3,[22,33,44]],4]
2 l2 = l1.copy()
3 l1[2].append(666)
4 print(l1)
5 print(l2)

输出结果:

1 [1, 2, [1, 2, 3, [22, 33, 44], 666], 4]
2 [1, 2, [1, 2, 3, [22, 33, 44], 666], 4]  ###浅copy,只在第一层创建了一个新的内存地址。第二层还是保持跟被copy的一样的内存地址
    • 深copy

      •  对于深copy来说,两个个体是相互独立的。改变一个的元素,另一个保持不变。

 

1 import copy
2 l1 = [1, 2, [1, 2, 3], 4]
3 l2 = copy.deepcopy(l1)
4 l1[2].append(666)
5 print(l1,l2)
6 print(id(l1[2]),id(l2[2]))

 

输出结果:

1 [1, 2, [1, 2, 3, 666], 4] [1, 2, [1, 2, 3], 4]         ###  深copy,两个列表相互独立。 
2 42041480 42042888                    

 

      •  切片算浅copy

 

1 l1 = [1,2,3,[22,33]]
2 l2 = l1[:]
3 l1[3].append(666)
4 print(l2)  # [1, 2, 3, [22, 33, 666]]

 

输出结果:

[1, 2, 3, [22, 33, 666]]    ###浅copy

 

       

posted on 2018-03-26 15:38  弃疾  阅读(91)  评论(0)    收藏  举报

导航