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。

  • 相关阅读:
    1451. Rearrange Words in a Sentence
    1450. Number of Students Doing Homework at a Given Time
    1452. People Whose List of Favorite Companies Is Not a Subset of Another List
    1447. Simplified Fractions
    1446. Consecutive Characters
    1448. Count Good Nodes in Binary Tree
    709. To Lower Case
    211. Add and Search Word
    918. Maximum Sum Circular Subarray
    lua 时间戳和时间互转
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8377535.html
Copyright © 2011-2022 走看看