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

    1 对于赋值运算,就是共同指向一个内存地址.将一个值赋予一个变量,那么它的内存地址同时也赋予了他,如果值是不可变类型,改变值,就会产生一个新值和新内存地址,
    如果值是可变类型那么内存地址不会变.
    s1 = 'alex'
    s2 = s1
    print(s1,id(s1))
    print(s2,id(s2))

    结果:

    当值是可变类型时

    s1 = []
    s2 = s1
    s2.append("a")
    print(s1,id(s1))
    print(s2,id(s2))
     
    结果:

     2 浅层copy 拷贝第一层的数据独立,第二层及以后公用一个内存地址

    #copy
    l1 = [1,2,3]
    l2 = l1.copy()
    l1.append(666)   #在第一层里添加数据
    print(l1,id(l1))
    print(l2,id(l2))
    l1 = [1,[22,33],2,3]
    l2 = l1.copy()
    l1[1].append(666)   #在第二层添加数据
    print(l1,id(l1))
    print(l2,id(l2))

    结果:

     3 深层copy 要引用模块  import copy  对于深copy,无论多少层,在内存中都是两个独立的内存地址

    import copy
    l1 = [1,[22,33,],2,3]
    l2 = copy.deepcopy(l1)
    l1.append(777)
    l1[1].append(666)
    print(l1,id(l1),id(l1[1]))
    print(l2,id(l2),id(l2[1]))

    结果:

     4 面试题

    l1 = [1,[1,2],2,3]
    l2 = l1[:]  # 是浅copy
    l1[1].append(111)
    print(l1,l2)
    #l2 是什么?

    结果:

     5 在列表循环过程中,如果删除数据,可能会报错,举例:

    将下列数据中奇数位删掉

    #方法一:
    l1 = [111,222,333,444,555]   # 删掉奇数就是保留偶数,将偶数数据找到,建个新列表代替原来列表
    l2 = []
    for i in range(len(l1)):
        if i % 2 == 0:
            l2.append(l1[i])
    l1 = l2
    print(l1)
    
    #方法二:
    l1 = [111,222,333,444,555,666,777]    # 通过切片的步长删掉奇数数据
    del l1[1::2]
    print(l1)
    #方法三 l1
    = [111,222,333,444,555] # 将索引倒序找奇数位 这样删掉数据就不会影响前面元素的索引 for i in range(len(l1)-1,-1,-1): if i % 2 == 1: del l1[i] print(l1)

    结果:

     6  字典在循环过程中,如果删掉数据也会报错

    dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}
    #不可变的数据类型:可哈希
    # for i in dic:
    #     if 'k' in i:
    #         del dic[i]
    print(dic)

    结果:  在迭代过程中字典大小改变

    对应方法dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}

    l1 = []
    for i in dic:   
    if 'k' in i:

    l1.append(i)
    for k in l1:
    del dic[k]
    print(dic)

    结果;  在字典循环中不能改变字典,但是新建个列表,把要删除的数据放到列表里,在循环列表,再循环列表过程中修改字典就不会报错.

     7 数据类型转换   元祖变列表list(tuple)   列表变元祖 tuple(list)

    #tuple <---> list
    l1 = [1,2,3]
    tu = tuple(l1)  #将列表换成元祖
    l2 = list(tu)    #将元祖变成列表
    print(tu,l2)

    结果:

    字典专属类型转换  可以变列表,元祖 但是元祖是不可变类型 一般转换成列表

    dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}
    print(list(dic.keys()))
    print(list(dic.values()))
    print(list(dic.items()))

     结果:

     8 集合

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

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

      去重,把一个列表变成集合,就自动去重了。

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

     9 集合的增。

    set1 = {'alex','wusir','ritian','egon','barry'}
    set1.add('景女神')
    print(set1)
    
    #update:迭代着增加
    set1.update('景女神')
    print(set1)

    结果:

     10 集合的删。

    set1 = {'alex','wusir','ritian','egon','barry'}
    
    set1.remove('alex')  # 删除一个元素
    print(set1)
    
    set1.pop()  # 随机删除一个元素
    print(set1)
    
    set1.clear()  # 清空集合
    print(set1)
    
    del set1  # 删除集合
    print(set1)

    结果:

     11 集合的交 并,反交 差集,超集和子集

     交集   (&  或者 intersection)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 & set2)  # {4, 5}
    print(set1.intersection(set2))  # {4, 5}

    结果:

       并集。(| 或者 union)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}
    
    print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7}

    结果:

       差集。(- 或者 difference)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 - set2)  # {1, 2, 3}
    print(set1.difference(set2))  # {1, 2, 3}

    结果:

      反交集。 (^ 或者 symmetric_difference)

    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
    print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

    结果:

       子集与超集

    set1 = {1,2,3}
    set2 = {1,2,3,4,5,6}
    
    print(set1 < set2)
    print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。
    
    print(set2 > set1)
    print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。

    结果:

         frozenset不可变集合,让集合变成不可变类型。把一个可迭代的元素添加到集合 如果有重复元素,自动删掉.

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

    结果:

     





  • 相关阅读:
    HBase读写数据的详细流程及ROOT表/META表介绍
    HBase的概述和安装部署
    Linux常用命令行补充——持续更新
    电信项目java补充类
    Kafka的接口回调 +自定义分区、拦截器
    Kafka命令行操作及常用API
    Kafka概述及安装部署
    Kafka生产者案例报警告SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    python threading
    python thread
  • 原文地址:https://www.cnblogs.com/wzbk/p/8377897.html
Copyright © 2011-2022 走看看