zoukankan      html  css  js  c++  java
  • python3.6入门到高阶(全栈) day07 深浅拷贝

    一. 基础数据部分的补充
    1. join: 把列表中的数据进行拼接。 拼接成字符串
    例 lst = ["alex", "wusir", "ritian", "taibai"]
    s = "_".join(lst) # 吧列表拼接起来. split()相反
    print(s)
    alex_wusir_ritian_taibai
    --------------
    例 s = ""
    for el in lst:
    s += el + "_"
    print(s.strip("_"))

    字符串转化成列表: split()
    列表转化成字符串:join()
    x->y类型 y(x)
    表示False的数据类型: False, 0, "", [], tuple(), dict(), set(), None.
    '''类型转换:
    元组 => 列表 list(tuple)
    列表 => 元组 tuple(list)
    list=>str str.join(list)
    str=>list str.split()
    转换成False的数据:
    0,'',None,[],(),{},set() ==> False
    '''

    2. 关于删除:
    列表和字典在循环的时候都不能删除。
    把要删除的内容保存在新列表中。 循环新列表。 删除老列表(字典)
    lst = ["王大锤", "王有才", "张小白", "刘大哥"]
    for el in let:
    lst.remove(el) # 删除是不彻底的, 原因是每次删除都会导致元素的移动, 每次都会更新一次索引
    要把删除的内容记录在一个新的表格中(注意: 由于删除元素会导致元素的索引改变, 所以容易出现问题.
    尽量不要再循环中直接去删除元素. 可以把要删除的元素添加到另⼀个集合中然后再批量删除. )
    例: new_lst = []
    for el in lst:
    new_lst.append(el) # 循环这个列表 删除原来的列表
    for el in new_lst: # 不会导致循环的列表的元素移动的问题
    lst.remove(el) # 注意 删除的是老的列表
    例: lst = ["王大锤", "王有才", "张小白", "刘大哥"] # 删除掉姓王的
    new_lst =[] # 装要删除的内容
    for el in lst:
    if el.startswith("王") # 判断字符串是否以"xxx"开头
    new_lst.append(el)
    for el in new_lst: # 找到再执行删除
    lst.remove(el)
    字典删除:{}
    例: dic = {"jay":'周杰伦', "jj":"林俊杰 ", "jack": "莱昂纳多迪卡普里奥"}
    #dic.clear()
    or
    lst = [] # 所有的key
    for el in dic:
    lst.append(el)
    for el in lst:
    dic.pop(el) # 删除对应的key

    3. fromkeys
    dict.fromkeys(iter, value)
    把可迭代对象进行迭代。 和后面的value组合成键值对 返回新字典
    例 dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']}
    注意:
    例 dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
    print(dic)
    dic.get("jay").append("胡大")
    print(dic)
    结果:
    {'jay': ['周杰伦', '麻花藤', '胡⼤'], 'JJ': ['周杰伦', '麻花藤', '胡⼤']}
    代码中只是更改了jay那个列表. 但是由于jay和JJ⽤的是同⼀个列表. 所以. 前⾯那个改了. 后
    ⾯那个也会跟着改

    坑1: 返回新字典。不会改变原来的字典
    dic = {} # 新建字典
    dd =dict() # 新建字典
    ddd ={} # 新建字典
    dic.fromkeys(xxx, xxx) #fromkeys 是创建新字典,不是在原有的基础上给你增加键值对
    print(dic) # {}
    坑2:
    d = fromkeys(xxx.[])
    字典中的所有的value都是同一个列表
    d =dict.fromkeys("周杰伦",['美特斯邦威'])
    print(d) # {'周': ['美特斯邦威'], '杰': ['美特斯邦威'], '伦': ['美特斯邦威']}
    d['周'].append('爽歪歪')
    print(d) # {'周': ['美特斯邦威', '爽歪歪'], '杰': ['美特斯邦威', '爽歪歪'], '伦': ['美特斯邦威', '爽歪歪']}
    ## value如果是可变的数据类型。所有的key都可以改动这个数据。一个改动,所有的value都跟着改变

    二. set集合
    特点:无序 不重复(字典自身不重复)。 set本身可变,不可hash . 内部元素必须可hash哈希(int,str,tuple,bool)
    是dict类型的数据但是不保存value ,只存key,set也用{}表示
    字典{}
    字典的key, 不可变 不能重复 底层存储是无序的
    set{}
    set里的元素,不可变 不能重复 底层也是无序的, 可hash
    应用:去重复
    例 lst = ["周杰伦",'周杰伦','王力宏','王力宏','馄饨面')
    s =set(lst) # 去重集合
    print(s)
    print(list(s)) # 转列表
    1. add() 添加
    s = {'刘嘉玲','关之琳','王祖贤'}
    s.add('王宝强')
    print(s)
    s.add('王宝强') # 重复的内容不会被添加到set集合中
    print(s)
    update()
    s.updte(['张曼玉','王祖蓝','王祖蓝'])
    print(s) # 无序的添加新元素,重复的内容依旧不会被添加到set集合中
    2 删除
    pop() # 随机弹出⼀个.
    remove() # 直接删除元素
    clear # 清空set集合.需要注意的是set集合如果是空的.
    打印出来是set() 因为要和dict区分的.


    3 修改 (没有索引,无法直接定位元素,不能直接修改)
    先remove 再add
    4 查询 # set 是可迭代对象,所以可for循环
    for el in s:

    三. 深浅拷贝(画图理解)
    1. = 赋值操作没有创建新的对象。 此时 两个变量指向的是同一个内存地址
    例 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也发⽣了改变

    2. 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
    # 浅拷⻉. 只会拷⻉第⼀层. 第⼆层的内容不会拷⻉. 所以被称为浅拷⻉

    3. 深拷贝
    # 优点: 完全拷贝出一份两个对象之间除了数据相同。 没有任何关系
    # 缺点: 占内存
    import copy
    copy.deepcopy() 深度拷贝。 把对象内部的所有内容都拷贝一份
    作用: 快速创建对象
    例 import copy
    lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
    lst2 = copy.deepcopy(lst1)
    lst1[3].append("无敌是多磨寂寞")
    print(lst1)
    print(lst2)
    print(id(lst1[3]), id(lst2[3]))
    结果:
    ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
    ['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅']]
    4447221448 4447233800
    # 都不⼀样了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制.
    不会产生⼀个改变另⼀个跟着改变的问题
  • 相关阅读:
    几何变换
    螺旋线
    生产环境高可用centos7 安装配置RocketMQ-双主双从-同步双写(2m-2s-sync)
    CentOS7 安装配置RocketMQ --主从模式(master-slave)异步复制
    MybatisPlus----入门
    elasticsearch中term和match以及text和keyboard的解释
    怎么解决Windows的elasticsearch编码闪退问题
    数据库技术之事务
    JDBC------之结果集元数据的操作02
    JDBC------之结果集元数据的操作01
  • 原文地址:https://www.cnblogs.com/wanxiangai/p/9849945.html
Copyright © 2011-2022 走看看