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

    一:关于str 的操作方法补充

    1,s.isspace()   判断字符串是否只由空格组成,是,为True,否则,为False。

    s = ' ' #只能是以至少一个空格组成的字符串(全空格)
    print(s.isspace())
    View Code

    二:关于tuple类型的补充

        当元组只有一个元素组成并且没有逗号,则该元素是什么数据类型,整体就是什么数据类型。

    tu = ('alex')
    tu1 = ('alex',)
    print(tu,type(tu))
    print(tu1,type(tu1))
    
    tu = ([1,2,3])
    tu1 = ([1,2,3],)
    print(tu,type(tu))
    print(tu1,type(tu1))
    tu.append('333')
    print(tu)
    View Code

    三:关于list的方法补充    

        在循环一个列表时,如果要是删除某些或者某类元素,容易出错,因为在依靠索引删除元素时,列表的的长度会发生变化,最终会导致索引超出列表长度范围。如将列表 l1 = [111,222,333,444,555] 将索引为基数位的元素删除。有以下三种方法,程序如下。

    # 方法一:
    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,0,-1):
        if i % 2 == 1:
            del l1[i]
    print(l1)
    View Code

    四:关于dict的方法补充

    1,关与dict.fromkeys()的用法

    dic = dict.fromkeys('abc','alex')
    print(dic)           #{'a': 'alex', 'b': 'alex', 'c': 'alex'}
    
    dic1 = dict.fromkeys([1,2,3],[])
    print(dic1)       #{1: [], 2: [], 3: []}
    dic1[1].append('alex')
    print(dic1)      #{1: ['alex'], 2: ['alex'], 3: ['alex']}
    View Code

    2, 在循环一个字典时,如果删除某些键值对,可能会报错。如要删除字典dic = {"k1":"alex","k2":"ritian","k3":"wusir",k4:"taibai"},要删除当前字典中带k的键值对时,有以下方法,程序如下:

    dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'}
    l1 = []
    for i in dic:
        if 'k' in i:
            l1.append(i)
    print(l1)
    for k in l1:
        del dic[k]
    print(dic)
    View Code

    五:数据类型之间的转换

    1,利用split可以把str类型转换为list类型,通过join也可以把list转化为str

    2,dict转化为list类型时,方法如下:

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

    六:深浅copy

    1,关于赋值运算,有如下程序:

    l1 = [1,2,3,4]
    l2 = l1
    l1.append(5)
    print(l1,l2)
    View Code

    最后打印的l1, l2结果相同,都是[1,2,3,4,5], 因为对于对于赋值运算,指向的都是同一个内存地址,因此当其中一个改变时,另一个也会随之改变。

    2,浅copy

        对于浅copy来说,第一层都是独立的内存地址,从第二层开始,都是指向同一个内存地址,一变都变。如下代码:

    l1 = [1,2,3]
    l2 = l1.copy()
    l1.append(666)
    print(l1,id(l1))      #[1, 2, 3, 666] 2845193877768
    print(l2,id(l2))      #[1, 2, 3] 2845193877128
    
    l1 = [1,[22,33,],2,3]
    l2 = l1.copy()
    l1[1].append(666)
    print(l1,id(l1),id(l1[1]))       #[1, [22, 33, 666], 2, 3] 2409427777160 2409427777800
    print(l2,id(l2),id(l2[1]))       #[1, [22, 33, 666], 2, 3] 2409456421384 2409427777800
    View Code

    3,深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]))   #[1, [22, 33, 666], 2, 3, 777] 2015999390280 2015999391624
    print(l2,id(l2),id(l2[1]))   #[1, [22, 33], 2, 3] 2015999506440 2015999506504
    View Code

     ps:若对一个列表从头到尾进行切片,则它是浅copy还是深copy呢?例如下的程序:

    l1 = [1,[1,2],2,3]
    l2 = l1[:]  
    l1[1].append(111)
    print(l1,l2)   #l1=l2=[1, [1, 2, 111], 2, 3]
    View Code

    最后,得到的结果是 l1=l2=[1,[1,2,111]  ,2 ,3], 可见,该列表的内层发生改变时,则对其切片的列表也随之发生了改变,所以,l1和l2的内层都指向同一个内存地址,故这是一个浅copy。

  • 相关阅读:
    Ubuntu+Windows双系统升级Windows启动项消失恢复
    day19 Servlet Filter
    day17 dbutils 和 jdbc 多表操作
    day16 事务
    day15 分页及 JDBC 大数据的处理
    day14 JDBC
    day13 MySQL 及数据库相关
    Windows系统中完全卸载MySQL数据库,实现重装
    Elasticsearch 6.5.4 安装IK Analysis插件
    js 常用功能
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8377535.html
Copyright © 2011-2022 走看看