day07 深浅拷贝

今日主要内容
1. 基础数据部分的补充
  1. join: 把列表中的数据进行拼接。 拼接成字符串

lst = ["alex", "wusir", "ritian", "taibai"]

s = '_'.join(lst) 
print(s)

 

  字符串转化成列表: split()
  列表转化成字符串:join()
  x->y类型 y(x)
  表示False的数据类型: False, 0, "", [], tuple(), dict(), set(), None.

 2. 关于删除:
  列表和字典在for循环的时候都不能删除。因为删除时,元素的索引会发生改变
  把要删除的内容保存在新列表中。 循环新列表。 删除老列表(字典)

lst = ["王大锤", "王有才", "张小白", "刘大哥"]
for el in lst:
    lst.remove(el) 
print(lst)
#删除不彻底,  剩下['王有才', '刘大哥']

new_lst = []   #装要删除的内容
for el in lst:
    new_lst.append(el)
#循环新列表的元素,对应找出原来列表的元素
for el in new_lst:
    lst.remove(el)  #根据新列表的元素,删除老列表的元素
print(lst)

lst = ["王大锤", "王有才", "张小白", "刘大哥"]
#删除姓王的
new_lst = []
for el in lst:
    if el.startswith(''):
        new_lst.append(el)
for el in new_lst:
    lst.remove(el)
print(lst)

  

dic = {"jay":'周杰伦', "jj":"林俊杰 ", "jack": "莱昂纳多迪卡普里奥"}
#清空字典
lst = []  #建立新的列表,把需要删除的内容保存
for k in dic:
    lst.append(k)
for el in lst:
    dic.pop(el)
print(dic)

  3. fromkeys

  dict.fromkeys(iterable, value)
  把可迭代对象进行迭代。 和后面的value组合成键值对 返回新字典

d = dict.fromkeys("周杰伦", "王尼玛")
print(d)
{'': '王尼玛', '': '王尼玛', '': '王尼玛'}
#第一项iterable ,共享value

  坑1: 返回新字典。不会改变原来的字典    fromkeys是一个staticmethod 静态方法

  dic = {}
  dic.fromkeys(xxx, xxx)
  print(dic)          # 结果是{}   

  d = dic.fromkeys(xxx, xxx) #这样创建的字典有内容

dic = {}
# d = dic.fromkeys("周杰伦", "王尼玛")
d = dict.fromkeys("周杰伦", "王尼玛")  #或者
print(d)   # {'周': '王尼玛', '杰': '王尼玛', '伦': '王尼玛'}
dict.fromkeys("周杰伦", "王尼玛")
print(dic)  #{}


  坑2:    你的value如果是可变的数据类型。 所有的key都可以改动这个数据。 一个改动, 所有的value都跟着改变

  d = fromkeys(xxx.[])
  字典中的所有的value都是同一个列表

d = dict.fromkeys('周杰伦', ['哇哈哈'])
print(d)
#{'周': ['哇哈哈'], '杰': ['哇哈哈'], '伦': ['哇哈哈']}
d[''].append('爽歪歪')
print(d)
#{'周': ['哇哈哈', '爽歪歪'], '杰': ['哇哈哈', '爽歪歪'], '伦': ['哇哈哈', '爽歪歪']}

2. set集合
  特点:无序不重复。 内部元素必须可哈希(不可变数据类型)

  集合其实就是字典. 集合里面不存value , 集合中只存储key
  应用: 去重  (重点)  
lst = ["周杰伦", "周杰伦", "王力宏", "王力宏", "胡辣汤"]
s = set(lst)
print(s)   #去重  {'王力宏', '周杰伦', '胡辣汤'}
print(list(s))  # 转换为列列表   可以不用重新赋值变量

  增删改查:

   1. add() 添加  重复内容不会被添加

   2.pop()  随机弹出一个

   3.remove()    指定元素删除  ,如果元素不存在  报错

   4.集合的数据没有索引  修改需要先删除后添加  即:先用.remove()   再.add()

   5.for 循环 查询 

  常用操作

    交集: s1.intersection(s2)  或者  s1 & s2

    并集:  s1.union(s2)  或者  s1 | s2

    差集:  s1.difference(s2)  或者  s1 - s2

    反交集:  s1.symmetric_difference(s2)   或者  s1 ^ s2

    子集: s1.issubset(s2)   或者 s1 <  s2

    超集: s1.issupperset(s2)   或者  s1 > s2

    

3. 深浅拷贝(画图理解)
  1. = 赋值操作没有创建新的对象。 此时 两个变量指向的是同一个内存地址

lst1 = ["孙悟空", "贝吉塔", "卡卡罗特"]
lst2 = lst1 # 赋值

lst1.append("短笛")

print(lst1)  #['孙悟空', '贝吉塔', '卡卡罗特', '短笛']
print(lst2)  #['孙悟空', '贝吉塔', '卡卡罗特', '短笛']

print(id(lst1), id(lst2))   #1046493921032 1046493921032

  2. copy() 或者 [:] 浅拷贝。 拷贝第一层内容

  浅拷贝的问题
  # 优点: 省内存.
  # 缺点: 容易出现同一个对象被多个变量所引用

  3. 深拷贝
  import copy
  copy.deepcopy() 深度拷贝。 把对象内部的所有内容都拷贝一份

  深拷贝
  # 有点: 完全拷贝出一份两个对象之间除了数据相同。 没有任何关系
  # 缺点: 占内存

  作用: 快速创建对象

原文地址:https://www.cnblogs.com/Knight-huang/p/9850831.html