Python基础第三天:集合、copy、deepcopy

一、集合

  集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合坐不了字典的键)的。

  以下是集合最重要的两点:

    1、去重:把一个列表变成集合,就去重了

    2、关系测试:测试两组数据之前的交集、差集、并集等关系

  1、集合的创建:

  set1 = set({1,2,'barry'})
  set2 = {1,2,'barry'}
  print(set1)
  print(set2)
  {1, 2, 'barry'}
  {
1, 2, 'barry'}

  2、集合的增

  set1 = {'alex','wusir','ritian','egon','barry'}
  set1.add('景女神')
  print(set1)

  #update:迭代着增加
  set1.update('A')
  print(set1)
  set1.update('老师')
  print(set1)
  set1.update([1,2,3])
  print(set1)
  {'wusir', '景女神', 'ritian', 'alex', 'barry', 'egon'}
  {'wusir', '景女神', 'ritian', 'A', 'alex', 'barry', 'egon'}
  {'wusir', '', '景女神', '', 'ritian', 'A', 'alex', 'barry', 'egon'}
  {1, 2, 3, 'wusir', '', '景女神', '', 'ritian', 'A', 'alex', 'barry', 'egon'}

  3、集合的删除

  set1 = {'alex','wusir','ritian','eqon','barry'}
  print(set1)
  #删除一个元素
  set1.remove('alex')
  print(set1)
  #删除第一个元素
  set1.pop()
  print(set1)
  #清空集合
  set1.clear()
  print(set1)
  del set1 #删除集合
  print(set1)
  {'ritian', 'wusir', 'alex', 'barry', 'eqon'}
  {'ritian', 'wusir', 'barry', 'eqon'}
  {'wusir', 'barry', 'eqon'}
  set()
  Traceback (most recent call last):
    File "D:/pythonStudy12/day02/05.py", line 32, in <module>
      print(set1)
  NameError: name 'set1' is not defined

  4、集合的其他操作:交集(& 或 intersection)、并集(| 或 union)、差集(- 或 difference)、反交集(^ 或 sysmmertric_difference)、子集、超集

  set1 = {1,2,3,4,5}
  set2 = {4,5,6,7,8}

  print("交集:")
  print(set1 & set2)
  print(set1.intersection(set2))
  print("并集:")
  print(set1 | set2)
  print(set1.union(set2))
  print("差集:")
  print(set1 - set2)
  print(set1.difference(set2))
  print("交反集:")
  print(set1 ^ set2)
  print(set1.symmetric_difference(set2))
  交集:
  {4, 5}
  {4, 5}
  并集:
  {1, 2, 3, 4, 5, 6, 7, 8}
  {1, 2, 3, 4, 5, 6, 7, 8}
  差集:
  {1, 2, 3}
  {1, 2, 3}
  交反集:
  {1, 2, 3, 6, 7, 8}
  {1, 2, 3, 6, 7, 8}
  #超集、子集
  set1 = {1,2,3}
  set2 = {1,2,3,4,5,6}
  #set1是set2子集
  print(set1 < set2)
  print(set1.issubset(set2))
  #set2是set1超集
  print(set2 > set1)
  print(set2.issuperset(set1))
  True
  True
  True
  True

  5、frozenset不可变集合,让集合变成不可变类型

    s = frozenset('barry')
    print(s,type(s))
  frozenset({'b', 'r', 'a', 'y'}) <class 'frozenset'>

二、深浅拷贝

  1、赋值运算

    对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的

  

  l1 = [1,2,3,['barry','alex']]
  l2 = l1
  l1[0] = 111
  print(l1)
  print(l2)
  l1[3][0] = 'wusir'
  print(l1)
  print(l2)
  [111, 2, 3, ['barry', 'alex']]
  [111, 2, 3, ['barry', 'alex']]
  [111, 2, 3, ['wusir', 'alex']]
  [111, 2, 3, ['wusir', 'alex']]

   2、浅拷贝:copy

  对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性

  l1 = [1,2,3,['barry','alex']]
  l2 = l1.copy()
  print(l1,id(l1))
  print(l2,id(l2))

  l1[1] = 222
  print(l1,id(l1))
  print(l2,id(l2))

  l1[3][0] = 'wusir'
  print(l1,id(l1))
  print(l2,id(l2))
  [1, 2, 3, ['barry', 'alex']] 35640712
  [1, 2, 3, ['barry', 'alex']] 35640840   [1, 222, 3, ['barry', 'alex']] 35640712   [1, 2, 3, ['barry', 'alex']] 35640840   [1, 222, 3, ['wusir', 'alex']] 35640712   [1, 2, 3, ['wusir', 'alex']] 35640840

  3、深拷贝:deepcopy

  对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变

  

  import copy
  l1 = [1, 2, 3, ['barry', 'alex']]
  l2 = copy.deepcopy(l1)

  print(l1,id(l1))
  print(l2,id(l2))

  l1[1] = 222
  print(l1,id(l1))
  print(l2,id(l2))

  l1[3][0] = 'wusir'
  print(l1,id(l1))
  print(l2,id(l2))
  [1, 2, 3, ['barry', 'alex']] 42286728
  [1, 2, 3, ['barry', 'alex']] 42451912

  [1, 222, 3, ['barry', 'alex']] 42286728   [1, 2, 3, ['barry', 'alex']] 42451912

  [1, 222, 3, ['wusir', 'alex']] 42286728   [1, 2, 3, ['barry', 'alex']] 42451912
原文地址:https://www.cnblogs.com/nzd123456/p/8961938.html