zoukankan      html  css  js  c++  java
  • python之基本数据类型及深浅拷贝

    一.数据基本类型之set集合

    set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key

    set集合,是一个无序且不重复的元素集合

    1.创建

    s = set()  #创建空集合
    
    s = {'values1','values2'}  #非空集合

    2.转换

    l = [1,2,5,11]
    t = (11,22,12)
    #元组转集合
    st2 = set(t)
    #列表转集合
    st = set(l)
    print(st)
    print(st2)

    3.常用支持操作

      添加元素-->add(key)

    s = set()
    s.add(1)
    print(s)

      删除元素-->remove(key)

    s = set([1,2,3])
    s.remove(1)
    print(s)

       清除元素-->clear()

    s = set([1,2,3,4,5])
    print(s)
    s.clear()
    print(s)

      比较元素-->difference()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #set1中有而set2中没有的值
    ret = set1.difference(set2)
    print(ret)

      删除两集合中相同的元素-->difference_update()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #从set1中删除和set2中相同的元素
    set1.difference_update(set2)
    print(set1)
    print(set2)

      移除元素-->discard(values)

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #移除指定元素,不存在不会报错,remove()不存在会报错,建议discard
    set1.discard(44)
    print(set1)

      取交集值-->intersection()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #取两个set集合的交集值
    ret = set1.intersection(set2)
    print(ret)

      取交集并更新-->intersection_update()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #取交集并更新到set1中
    set1.intersection_update(set2)
    print(set1)

      判断是否交集-->isdisjoint()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #如果两个集合有交集返回false,反之返回true
    print(set1.isdisjoint(set2))

      子序列-->issubset()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #判断是否是子集,是返回true,反之返回Flase
    print(set1.issubset(set2))

      父序列-->issuperset()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #是否是父序列,是返回True,反之返回Flase
    print(set1.issuperset(set2))

      对称交集-->symmetric_difference()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #对称交集,取两个集合中互不存在的元素,生成一个新的集合
    ret = set1.symmetric_difference(set2)
    print(ret)

      对称交集并更新-->symmetric_difference_update()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #对称交集,并更新元素到set1中
    set1.symmetric_difference_update(set2)
    print(set1)

      并集-->union()

    set1 = {1,44,87,23,55}
    set2 = {1,44,88,23,67}
    #并集并更新到新的集合中
    ret = set1.union(set2)
    print(ret)

    二.深浅拷贝

    1.数字和字符串

      对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址

    import copy
    # ######### 数字、字符串 #########
    n1 = 123
    # n1 = "i am alex age 10"
    print(id(n1))
    # ## 赋值 ##
    n2 = n1
    print(id(n2))
    # ## 浅拷贝 ##
    n2 = copy.copy(n1)
    print(id(n2))
      
    # ## 深拷贝 ##
    n3 = copy.deepcopy(n1)
    print(id(n3))

    二,其他数据类型

    对于list dict,tuple  浅拷贝只拷贝最外一层,深拷贝除了最后一层(因最后一层是字符串)其余的都拷贝

    • 赋值

      赋值,只是创建一个变量,该变量指向原来内存地址,如

    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
      
    n2 = n1

      解析图如下:

    • 浅拷贝

      浅拷贝,在内存中只额外创建第一层数据

      

    import copy
      
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
      
    n3 = copy.copy(n1)

    解析图如下:

    • 深拷贝:

      深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

    import copy
      
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
      
    n4 = copy.deepcopy(n1)

    解析图如下:

    三.集合作业

    1.寻找差异,并将new_dict的值更新到old_dict中

    old_dict = {
        "#1":11,
        "#2":22,
        "#3": 100
    }
    
    new_dict = {
        "#1":33,
        "#4":22,
        "#7": 100
    }
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    old_dict = { "#1":11, "#2":22, "#3": 100 } new_dict = { "#1":33, "#4":22, "#7": 100 } old_keys = old_dict.keys() new_keys = new_dict.keys() old_set = set(old_keys) new_set = set(new_keys) #old存在new不存在,并删除new中不存在,old 中存在的元素 del_set = old_set.difference(new_set) for i in del_set: del old_dict[i] #new存在old不存在 add_set = new_set.difference(old_set) for a in add_set: old_dict[a] = new_dict[a] #更新旧数据表 update_set = old_set.intersection(new_set) for u in update_set: old_dict[u] = new_dict[u] print(old_dict)
  • 相关阅读:
    linux 安装jdk
    linux 安装 Redis
    jvisualvm监控远程jvm的两种连接方式
    list转map(JDK8-Lambda表达式)
    循环删除list中的某一元素的三种方式
    SpringBoot-@ControllerAdvice 拦截异常并统一处理
    Spring-@ControllerAdvice 拦截异常并统一处理
    Tomcat系列
    thinkPHP5.1模型User设计
    uniapp后台api设计(微信user表)
  • 原文地址:https://www.cnblogs.com/jl-bai/p/5471224.html
Copyright © 2011-2022 走看看