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

    集合set:

    集合也和列表数组一样有增加,但是集合是真正的没有顺序的  所以集合无法查找的,并且集合的外观你看着好像是字典和列表的组合,因为它是用字典的括号一样 ,但是又是里面并没有键值对  只是一个一个的元素来存储

    set内的元素必须是不可以变的

    frozenset    把一个动态集合变成静态集合 就是把一个可变的集合变成不可变的

    s = {1, 2, 3, 4, 5}
    s.add(7)
    frozenset(s)   #直接把上面可变的集合转化为不可变的 

    用frozenset转化后的 集合不可以对他进行增删改查

    功能:1、去重 (如果你把字典中去除以后 ,就可以把字典中重复的内容给剔除掉)  list(set)  set(list)

       2、测试关系

    集合的增加add和update  (因为集合是无序的所以它的增加也是无序的)

    >>> set ={1, 2, 3, 4}
    >>> set.add('女神')
    >>> print(set)
    {'女神', 1, 2, 3, 4}
    >>> 
    View Code

    update 是迭代添加  

    >>> set.update('abc')
    >>> print(set)
    {1, 2, 3, 4, 'b', 'c', 'a', '女神'}
    >>> 
    View Code

    集合的删除 pop随机删除  clear清空集合  del删除集合  remove选择元素删除

    交集:&

    并集  |

    反交集:^

    差集:set1 -set2

    元组的补充:

    如果元组里面只有一个元素 那么要在这个元素后面加个括号  不然这个元组的显示就会只显示这个元素 不显示最外面的括号

    >>> tu = (1)
    >>> print(tu)
    1       #只显示这么一个元素 元组最外面的括号没有了
    >>> 

    上面可以看到如果不在唯一个元素后面加上逗号就会只显示这个逗号本身  下面我们加上逗号试试

    >>> tu1 = (1 ,)
    >>> print(tu1)
    (1,)  #可以看出加了这个括号就把括号给打印出来了
    >>> 

    还有在循环的时候最好不要对所循环的列表进行删除 如果增加删除的会把列表的索引进行

    #错误的操作
    
    li =[11, 22, 33, 44, 55]
    for i in len(li):
        if i %2 == 1 :
            del[i]   #这个操作的话每一次循环它里面的元素都在被改变  因为你删除的是它每一次循环的不同的元素
    print(li)

      如果这样的话 用切片删除就可以了 切片删除就不会造成这种错误

    li =[11, 22, 33, 44, 55]
    
    for i in range(len(li)-1, -1, -1):
        if i %2 == 1 :
            del li[i]
    print(li)

    深浅copy;

    copy 不是指向同一个地址值,而是在内存中又开辟了一个内存空间

    对于浅copy来说  第一层创建的是新的内存地址值,而从第二层开始,指向的都是同一个内存地址

    所以 对于第二层以及更深层次来说  保持一致

    >>> l1 = [1, 2, 3,[1, 2, 3, 4], 4]
    >>> l2 =l1.copy()
    >>> print(l1)
    [1, 2, 3, [1, 2, 3, 4], 4]
    >>> print(l2)
    [1, 2, 3, [1, 2, 3, 4], 4]
    >>> 
    #你们看这个虽然数值一样但是地址值不同
    
    >>> print(id(l1))
    2158771026056
    >>> print(id(l2))
    2158770945224
    >>> 
    大家看浅copy是虽然数值一样,但是其实他们的地址值是不同的,但是他们的里面的相同的列表或者集合内的元素的地址值相同
    
    >>> l1 =[1, 2, 3, [1, 2, 3, 4],4]
    >>> l2 = l1.copy()
    >>> print(l1)
    [1, 2, 3, [1, 2, 3, 4], 4]
    >>> print(l2)
    [1, 2, 3, [1, 2, 3, 4], 4]
    >>> print(id(l1))
    2348230553736
    >>> print(id(l2))
    2348231143688
    >>>       #大家可以看到他们的地址值不同
    >>> print(id(l1[3]))
    2348230547848
    >>> print(id(l2[3]))
    2348230547848
    >>>   #而现在  他么的里面相同的数值的地址值又相同了

    deepcopy

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

    深copy的 同时要先把copy的模块导入进去  因为你要导入进去才能用

    import copy 

    >>> import copy
    >>> li = [1, 2, 3, [1, 3]]
    >>> l1 = copy.deepcopy(li)
    >>> print(li)
    [1, 2, 3, [1, 3]]
    >>> print(l1)
    [1, 2, 3, [1, 3]]
    >>> print(id(li))
    2227247224456
    >>> print(id(l1))
    2227201063240
    >>> print(id(li[3]))
    2227247821064
    >>> print(id(l1[3]))
    2227247224264
    >>> 

    数据类型转化成bool 为False:  0   空字符串   空列表   空字典  空元组

    int对应的是0  字符串的False是空字符串  列表对应的Flase是空列表,字典对应的False是空字典   元组对应的False是空元组

       

  • 相关阅读:
    mysql各个版本下载地址
    hadoop-0.20.2完全分布式集群
    04_Spring中使用Quartz
    03_CronTrigger
    02_SimpleTrigger
    02_ActiveMQ入门
    01_JMS概述
    01_Quartz基础结构
    Java开发高性能网站需要关注的事
    06_Jedis完成MySQL的条件查询案例
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/8651510.html
Copyright © 2011-2022 走看看