zoukankan      html  css  js  c++  java
  • 基础数据类型的补充以及深浅copy

    元组
    如果元组中只有一个数据,且没有逗号,则该‘元组’与里面的数据的数据类型相同。

    tu1 = (1)
    tu2 = (1,)
    print(tu1, type(tu1))
    print(tu2, type(tu2))
    tu3 = ('alex')
    tu4 = ('alex',)
    tu5 = ([1,2,3])
    
    print(tu3, type(tu3))
    print(tu4, type(tu4))
    print(tu5, type(tu5))
    

      

    列表
    列表与列表可以相加

    l1 = [1, 2, 3]
    l2 = ['alex', 'wusir']
    l3 = l1 + l2
    print(l3)
    

      

    在循环一个列表时,最好不要对此列表进行改变大小(增删)操作

    l1 = [11, 22, 33, 44, 55, 66, 77]
    # 将列表中索引为奇数的元素全部删除
    
    # 方法一:切片+步长删除
    # del l1[1::2]
    # print(l1)
    
    
    # for i in l1:
    #     if l1.index(i) % 2 ==1:
    #         l1.pop(l1.index(i))
    # print(l1)
    
    '''
    # 在循环一个列表时,如果对列表中的某些元素进行删除,
    # 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
    '''
    
    # 方法二  将元素取出来添加到新列表,再将新列表赋值到原列表
    
    l1 = [11, 22, 33, 44, 55, 66, 77]
    l2 = []
    for i in range(len(l1)):
        if i % 2 == 0:
            l2 .append(l1[i])
    print(l2)
    l1 = l2
    print(l1)
    
    
    # 方法三  倒着删除
    
    l1 = [11, 22, 33, 44, 55, 66, 77]
    for index in range(len(l1)-1, -1, -1):
        if index % 2 == 1:
            l1.pop(index)
    print(l1)
    

      

    ic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
    
    # 将dic的键中含有k元素的所有键值对删除
    '''
    for k in dic:
        if "k" in k:
            del dic[k]
    print(dic)
    
    报错原因:dictionary changed size during iteration
    在循环一个字典中,不能改变字典的大小。
    

      

    字典面试题:创建字典的方式

    1.
    dic = {'name':'alex'}
    
    2. 
    dic = dict({'name':'alex'})
    
    3.fromkeys
    '''
    # fromkeys()
    dic1 = dict.fromkeys([1, 2, 3], 'alex')
    print(dic1)   #{1: 'alex', 2: 'alex', 3: 'alex'}
    
    # 陷阱
    dic2 = dict.fromkeys([1, 2, 3], [])
    print(dic2)   #{1: [], 2: [], 3: []}
    dic2[1].append('alex')
    print(dic2)   #{1: ['alex'], 2: ['alex'], 3: ['alex']}
    print(id(dic2[1]))   #2304578552072  对应同一地址
    print(id(dic2[2]))
    print(id(dic2[3]))
    

    数据类型的转换
    int str bool 三者转换
    str <--> bytes
    str <--> list

    dict.key() dict.values() dict.item() 都可以转换成列表

    tuple <--> list
    dic --> lsit

    # str --->lsit
    s1 = 'alex wuris taibai'
    l1 = s1.split()
    print(l1)
    # list --->str  前提此list中的元素全部都是str类型
    l1 = ['alex', 'wuris', 'taibai']
    s1 = ' '.join(l1)
    print(s1)
    
    
    # list --->tuple
    l1 = [1, 2, 3]
    tu1 = tuple(l1)
    
    # tuple ---> list
    tu2 = (1,2,4)
    l1 = list(tu2)
    print(l1)
    

      

    集合与深浅copy

    set = {'alex', 'wusir', 1, 2, 3}

    集合要求里面的元素必须是不可变的数据类型,但是集合本身是可变的数据类型。
    集合里面的元素不重复(天然去重),无序。

    主要用途:
    1.去重
    2.关系测试

    list去重*****
    l1 = [1,1,2,3,4,5,4,6,1,2,2]
    set1 = set(l1)
    l2 = list(set1)
    print(set1)
     
    # 增
    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)
     
    # 删
    set1 = {'alex','wusir','ritian','egon','barry'}
     
    set1.remove('alex')  # 删除一个元素
    print(set1)
     
    set1.pop()  # 随机删除一个元素
    print(set1)
     
    set1.clear()  # 清空集合
    print(set1)
     
    # del set1  # 删除集合
    # print(set1)
     
     
    # 关系测试
    # 交集
    set1 = {1,2,3,4,5}
    set2 = {4,5,6,7,8}
    print(set1 & set2)
    print(set1.intersection(set2))
     
    # 并集
    print(set1|set2)
    print(set1.union(set2))
     
    #反交集
    print(set1 ^set2)
    print(set1.symmetric_difference(set2))
     
    # 差集
    print(set1 - set2)
    print(set1.difference(set2))
     
    # 子集与超集
    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超集。
     
    # 将集合变成不可变 ***
    set1 = frozenset(set1)
    print(set1)
    

    浅copy:第一层在内存中独立的,从第二层开始以及更深的层数,都使用同一个内存地址,一变都变  

    # 浅copy
    l1 = [1, 2, 3]
    l2 = l1.copy()
    print(l2)
    print(id(l1))
    print(id(l2))
    l1 = [1, 2, 3, [22,55]]
    l2 = l1.copy()
    l1[-1].append(666)
     
    print(l1)
    print(l2)
    print(id(l1)) #地址不一样
    print(id(l2))
     
    print(id(l1[-1]))  #地址一样
    print(id(l2[-1]))
    

      

    深copy:这两个是完全独立的,互不影响

    import copy
    l1 = [1, 2, 3, [22,55]]
    l2 = copy.deepcopy(l1)
    l1[-1].append(666)
     
    print(l1)
    print(l2)
    print(id(l1)) #地址不一样
    print(id(l2))
     
    print(id(l1[-1]))  #地址不一样
    print(id(l2[-1]))
     
     
    '''
    应用场景:面试会考,解释深浅copy
        完全独立的copy一份数据,与原数据没有关系,深copy
        如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy
         
    面试题2:
     
    '''
    # 面试题2: 切片属于浅copy
    l1 = [1, 2, 3, [22, 33]]
    l2 = l1[:]
    # l1.append(66)
    print(l1)
    print(l2)
    # l1[-1].append(666)
    print(l2)
    

      

     

      

  • 相关阅读:
    eclipse中误删tomcat后,文件都报错,恢复server时无法选择tomcat7.0解决办法
    java web多组件协作实现用户登录验证
    设计模式--享元模式
    设计模式--中介者模式
    设计模式--职责链模式
    设计模式--观察者模式与命令模式
    设计模式--桥接模式
    设计模式--迭代器模式
    设计模式--组合模式
    设计模式--备忘录模式
  • 原文地址:https://www.cnblogs.com/eaoo/p/9455398.html
Copyright © 2011-2022 走看看