zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    mysql-数据库增删改查
    判断,循环
    数组
    html 三种垂直居中
    箭头函数
    Array类型
    object
    JAVA WEB 行业技术
    一个好的程序员
    经典语录
  • 原文地址:https://www.cnblogs.com/nzd123456/p/8961938.html
Copyright © 2011-2022 走看看