zoukankan      html  css  js  c++  java
  • DAY7 集合,深浅copy

    一.集合set

      (1)集合是无序的,不重复的数据集合,它里面的元素的类型是可哈希的(即:不可变类型),但是集合本身是可变类型,能够进行增删查操作。

      (2)空集合的表示方法:set()

      (3)集合的作用:

          1. 数据去重,把一个列表变成集合,就自动去重。

          2. 关系测试,测试两组数据的并集,交集,差集等...

       # 创建元组

    set1 = {1,2,3,4}
    print(set1)
    >>> {1, 2, 3, 4}
    
    # 集合的元素都是不可变类型,所以只能包含数值,字符串,元组。
    set2 = {1,2,3,['python']}
    print(set2)
    >>>>>>TypeError: unhashable type: 'list'
    
    #通过set()方法创建集合
    set3 = set({1,2,3,'barry'})
    print(set3)
    

      # 集合的操作

      (1)增

    #谨记:集合是无序的
    '''add()'''
    set1 =  {'alex','wusir','evj','taibai'}
    set1.add('he')
    print(set1)
    >>>{'he', 'alex', 'evj', 'wusir', 'taibai'}
    
    '''update():把可迭代对象的元素分别增加'''
    set1 =  {'alex','wusir','evj','taibai'}
    set1.update('A')
    print(set1)
    >>>{'alex', 'taibai', 'A', 'evj', 'wusir'}
    
    set1.update('老师')
    print(set1)
    >>> {'taibai', '老', 'wusir', 'evj', '师', 'alex'}
    
    set1.update([1,2,3])
    print(set1)
    >>> {1, 'wusir', 2, 3, 'evj', 'alex', 'taibai'}
    

      (2)删

    '''remove(element):删除一个元素,如果不存在,则报错'''
    set1 =  {'alex','wusir','evj','taibai'}
    set1.remove('alex')
    set1.remove('he')   #元素不存在,则会报错
    >>>KeyError: 'he'
    print(set1)
    
    '''pop():随机删除一个元素,并返回此元素'''
    set1 =  {'alex','wusir','evj','taibai'}
    res=set1.pop()
    print(res)
    print(set1)
    
    '''clear():清空集合,保留集合本身'''
    set1 =  {'alex','wusir','evj','taibai'}
    set1.clear()
    print(set1)
    >>> set()        #谨记:空集合的写法为:set()
    
    '''del语句 在内存级别删除集合本身'''
    set1 =  {'alex','wusir','evj','taibai'}
    del set1
    print(set1)
    

      (3)集合的关系测试

    #并集(| 或 union)
    set1 = {1,2,3}
    set2 = {4,5}
    set3 = set1 | set2
    print(set3)
    set3 = set1.union(set2)
    print(set3)
    
    # 交集(& 或 intersection)
    set1 = {1,2,3}
    set2 = {3,4}
    set3 = set1 & set2
    print(set3)
    
    
    # 反交集(^ 或 symmetric_difference)
    set1 = {1,2,3}
    set2 = {3,4}
    set3 = set1.symmetric_difference(set2)
    print(set3)
    
    
    # 差集(- 或者 difference)
    set1 = {1,2,3,4,5}
    set2 = {1,2,3}
    set3 = set1 - set2
    print(set3)
    set3 = set1.difference(set2)
    print(set3)
    
    #子集 <, issubset()
    set1 = {1,2,3,4,5}
    set2 = {1,2,3}
    print(set2 < set1)
    print(set2.issubset(set1))
    
    #超集 >,issuperset()
    
    

    二.深浅copy详解

    事前须知:赋值的含义

    l1 = [1,2,3]
    l2 = l1
    l1.append(666)
    print(l2)
    print(id(l1))
    print(id(l2))
    >>>
    [1, 2, 3, 666]
    2153377571720     
    2153377571720    #证明l1,l2在内存中指向的是同一个地址。所以l1改变,L2也会变。
    

    (1)浅copy

    l1 = [1,2,3]
    l2 = l1.copy() l1.append(666) print(l1) print(l2) >>> [1, 2, 3, 666] [1, 2, 3] ****从上面的代码看,好像没有太大问题,接着往下看,神奇的事情发生了****
    l1 = [1,2,3,[22]] l2 = l1.copy() l1[-1].append(666) print(l1) >>>[1, 2, 3, [22, 666]] print(l2) >>>[1, 2, 3, [22, 666]] print(id(l1)) print(id(l2)) print(id(l1[0])) print(id(l2[0])) print(id(l1[-1])) print(id(l2[-1])) >>> 2233198322568 2233199144648 1964990688 1964990688 2233198322696 2233198322696

     总结:

       浅copy只是在第一层的内存地址是不同的,从第二层开始以及更深层,都是共用的一个内存地址。

    (2)深copy

    # 深copy需要用到copy模块中的deepcopy()方法
    import copy
    l1 = [1,2,3,[22]]
    l2 = copy.deepcopy(l1)    
    l1.append(666)
    print(l1)
    print(l2)
    >>>
    [1, 2, 3, [22], 666]
    [1, 2, 3, [22]]
    
    
    import copy
    l1 = [1,2,3,[22]]
    l2 = copy.deepcopy(l1)
    l1[-1].append(666)
    print(l1)
    print(l2)
    >>>
    [1, 2, 3, [22, 666]]
    [1, 2, 3, [22]]

    print(id(l1))
    print(id(l2))
    print(id(l1[-1]))
    print(id(l2[-1]))
    >>>

    1590872594312
    1590872595592
    1590872594120
    1590872595528

    总结:

      深copy的两个对象之间是完全独立的关系,两个对象的内存地址完全不一样。

    (3)应用场景:

      1.完全独立的copy一份数据,与原数据没有关系,就使用深copy。

      2.如果有一份数据的第二层想与原数据进行共有,就使用浅copy。

    (4)面试题:

      一.解释深浅copy的含义。

      二.完全切片[:]属于浅copy

    l1 = [1,2,3,[22,33]]
    l2 = l1[:]
    # l1.append(66)
    # print(l1)
    # print(l2)
    
    l1[-1].append(66)
    print(l1)
    >>> [1,2,3,[22,33,66]] print(l2)
    >>> [1,2,3,[22,33,66]]

      

      

      

      

      

  • 相关阅读:
    SQLSERVER 根据传入的参数拼接sql语句字符串,反馈结果集
    SQLSERVER 时间函数汇总
    在网页中加入百度地图
    关于收到谷歌邮件 Googlebot can't access your site 的解决方法
    phoneGap 3.5 eclipise 模拟器调试
    将MongoDB设为Windows服务
    apply 判定变量类型
    angularjs 手动启动
    Angular js ie 7,8 兼容性
    jQuery 之正则表达式篇
  • 原文地址:https://www.cnblogs.com/hebbhao/p/9455329.html
Copyright © 2011-2022 走看看