zoukankan      html  css  js  c++  java
  • 深浅拷贝, for循环小知识点 str操作 list的删除问题,类型转换

    深浅拷⻉  : 

    lst1 = ["⾦⽑狮王", "紫衫⻰王", "⽩眉鹰王", "⻘翼蝠王"]
    lst2 = lst1
    print(lst1)
    print(lst2)
    lst1.append("杨逍")
    print(lst1)
    print(lst2)
    结果:
    ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
    ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']

    dic1 = {"id": 123, "name": "谢逊"}
    dic2 = dic1
    print(dic1)
    print(dic2)
    dic1[
    'name'] = "范瑶"
    print(dic1)
    print(dic2)
    结果:
    {'id': 123, 'name': '
    谢逊'}
    {'id': 123, 'name': '
    谢逊'}
    {'id': 123, 'name': '
    范瑶'}
    {'id': 123, 'name': '
    范瑶'}

      对于list, set, dict, 直接. 是把内存地址给变量. 不是复制内容. 所以.
    lst1的内存指向和lst2是⼀样的. lst1改变了, lst2发⽣了改变

    1. 浅拷贝   copy()

    lst1 = ["何炅", "杜海涛","周渝⺠"]
    lst2 = lst1.copy()
    lst1.append("李嘉诚")
    print(lst1)
    print(lst2)
    print(id(lst1), id(lst2))
    结果:
    两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉


    lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
    lst2 = lst1.copy()
    lst1[
    3].append("⽆敌是多磨寂寞")
    print(lst1)
    print(lst2)
    print(id(lst1[3]), id(lst2[3]))
    结果:
    ['
    何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
    ['
    何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
    4417248328 4417248328

     深拷贝 

      1. 开头 引用模块   import  copy 

       deepcopy()

    import copy
    import copylst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]] lst2 = copy.deepcopy(lst1) lst1[3].append("⽆敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']] ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅']] 4447221448 4447233800

      都不⼀样了. 深度拷⻉. 元素元素进⾏拷⻉复制. 不会产⽣⼀个改变⼀个
    改变的问题

     str操作
          1.  join() 把列表变成字符串
           2. split() 把字符串转换成列表

    # lst = ["黄飞鸿", "霍元甲", "十三姨", "鬼脚七"]
    # s = "_*_".join(lst) # 把列表变成字符串. 用前面的字符串把列表连接起来, 返回新字符串
    # print(s)
    
    # s = "金毛狮王"
    # s1 = "_".join(s)    # 迭代把每一项进行拼接
    # print(s1) # 金毛狮王
    
    # tu = ('你好', "你不好", "你好不好")
    # s = "".join(tu)
    # print(s)
    
    s = "你今天准备什么时候睡觉"
    s1 = "_".join(s) # 你_今_天_...
    lst = s1.split("_")
    print(lst)
    

      for循环的问题.

    # index = 1
    # while index < 11:
    #     index = index + 1
    #     if index == 5:
    #         break
    #     print(index)
    # else:
    #     print("哈哈哈")
    # print("呵呵")
    # 234呵呵
    
    # for 从1  到10
    for i in range(1, 11):
        print(i)
        if i == 3:
            break   # 也可以使用break和continue
    else:   #  for循环后面也有else
        print("蒙哥, 看啥呢???")
    print("那里没有代码")
    

      

    list的删除问题(绕)
           1. 列表在循环的时候如果执行了删除操作. 索引和长度会有变化. 这种删除是不安全.
           2. 先把要删除的内容放在一个新列表中. 然后循环这个新列表. 删除老列表.
           3. dict在循环过程中是不允许删除的.
            4.把要删除的键放在列表中. 循环列表删除字典
     
    li = [11, 22, 33, 44]
    for e in li:
    li.remove(e)
    print(li)
    结果:
    [22, 44]
    

      分析原:
    for的运⾏过. 会有⼀个指来记录当前循环元素是哪⼀个, ⼀开始这个指指向0
    . 然后获取到0元素. 接着删除0. 这个时候. 来是⼀个的元素会⾃的变成
    0. 然后指向后移动⼀次, 指向1元素. 这时来的1变成了0, 也就不会被删除了

     

    pop删除试试:

     li = [11, 22, 33, 44]

    for i in range(0, len(li)):
    del li[i]
    print(li)
    结果: 报错
    # i= 0, 1, 2 删除的时候li[0] 被删除之后. 后⾯⼀个就变成了第0.
    # 以此类推. i = 2的时候. list中只有⼀个元素. 但是这个时候删除的是第2个 肯定报错啊




    分析发. 循环删除都不⾏. 不论是⽤del是⽤remove. 都不能. 那么pop?
    for el in li:
    li.pop() # pop
    也不⾏
    print(li)
    结果:
    [11, 22]


    只有这样是可以的:
    for i in range(0, len(li)): # 循环len(li), 然后从后往前删除
    li.pop()
    print(li)


    或者. ⼀个表来记你要删除的内容. 然后循环删除
    li = [11, 22, 33, 44]
    del_li = []
    for e in li:
    del_li.append(e)
    for e in del_li:
    li.remove(e)
    print(li)

      注意: 于删除元素导致元素的索改变, 所以容出现问题. 量不要再循环中直接去删
    元素. 可以把要删除的元素添加到⼀个集合中然后再批量删除

     dict中的fromkey(),可以帮我们通过list来创建⼀个dict 

    dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']}
    

      前⾯列表中的每⼀都会作为key, ⾯列表中的内容作为value. dict
    . 注意:

    dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    dic.get("jay").append("胡⼤")
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤', '胡⼤'], 'JJ': ['周杰伦', '麻花藤', '胡⼤']}
    

      代码中只是改了jay那个. 但是jayJJ⽤的是同⼀个. 所以. 前⾯那个改了.
    那个也会着改

     

    dict中的元素代过中是不允许进⾏删除的

    dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦⽼板'}
    # 删除key中带有'k'的元素
    for k in dic:
    if 'k' in k:
    del dic[k] # dictionary changed size during iteration, 在循环迭
    代的时候不允许进⾏删除操作
    print(dic)
    

     ? 把要删除的元素暂时保存在⼀个list, 然后循环list, 删除

    dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦⽼板'}
    dic_del_list = []
    # 删除key中带有'k'的元素
    for k in dic:
    if 'k' in k:
    dic_del_list.append(k)
    for el in dic_del_list:
    del dic[el]
    print(dic)
    

      

    # lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"]
    # clear()
    # lst.clear()
    # print(lst)
    # 有问题
    # for i in lst:
    #     lst.remove(i)
    # print(lst)
    
    # for i in lst:# for在这里的意义是记录删除的次数
    #     del lst[0] # 不正确
    # print(lst)
    
    
    
    lst = ["倚天屠龙记", "诛仙", "看见", "追风筝的人"]
    
    # 正确
    # for i in range(0, len(lst)):
    #     lst.pop()
    # print(lst)
    
    # # 把要删除的东西保存在一个新列表中
    # new_lst = []
    # for el in lst:
    #     new_lst.append(el)
    # # 循环新列表. 删除老列表
    # for e in new_lst:
    #     lst.remove(e)
    # print(lst)
    

      

    类型转换:
    => list(tuple)
    => tuple(list)
    list=>str str.join(list)
    str=>list str.split()
    转换成False的数据:
    0,'',None,[],(),{},set() ==> False

     

  • 相关阅读:
    【idea-部署web项目】
    【IDEA下使用tomcat部署web项目】
    【 PLSQL Developer安装、tnsnames.ora配置 解答】
    【idea--git】
    【Sping管理bean的原理】
    【关于eclipse的一些自己常用的插件】
    【Spring-任务调度】
    【mysql存储引擎】
    【mysql-索引+存储过程+函数+触发器-更新。。。】
    【转-mysql-explain介绍】
  • 原文地址:https://www.cnblogs.com/liuye1990/p/9152433.html
Copyright © 2011-2022 走看看