python中的深浅拷贝(copy)

时间:2021-01-02 19:49:15

字符串中的join方法

将列表转换成字符串,每个元素间用"内容"拼接,

join(可迭代对象)

s = ["高华新","刘清扬","崔园樟"]
s1 = "-".join(s)
print(s1) >>> 高华新-刘清扬-崔园樟

 

split() 字符串转换成列表

ss = "高华新**刘清扬**崔园樟"
print(ss.split("**")) >>> ['高华新', '刘清扬', '崔园樟']

 

列表和字典在循环的时候不能直接删除,需要把删除的内容放在一个新列表中,然后再循环新列表,再删除字典和列表中所对应的内容

列表的直接remove删除:

lst = ["紫云", "大云", "玉溪", "紫钻","a","b"]
for el in lst:   # 有一个变量来记录当前循环的位置
    lst.remove(el)
print(lst)  >>>  ['大云', '紫钻', 'b']                  
#删除的时候, 发现. 剩余了一下内容. 原因是内部的索引在改变.
# # 需要把要删除的内容记录下来. 然后循环这个记录. 删除原来的列表

创建新列表删除

lst = ["紫云", "大云", "玉溪", "紫钻","a","b"]
li = []
for i in lst:      # 遍历列表中的元素
    li.append(i)    #将将删除的元素添加到新列表中 
for i in li:        #遍历新列表中的元素  
    lst.remove(i)       #旧列表删除内容,因为遍历的是新列表中的元素,所以原来的列表元素位置就不会自动往前走,不会内部循环
                        # 是最安全的
print(lst) >>> []       # 空列表
lst = ["张国荣", '张铁林', '张国立', "张曼玉", "汪峰"]
# 删掉姓张的

zhangs = []
for el in lst:
    if el.startswith(""):    # 记录姓张的.
        zhangs.append(el)       #将姓张的放在新列表中
for el in zhangs:               #遍历新列表
    lst.remove(el)              #删除老列表中姓张的
print(lst)  >>>  ['汪峰']
print(zhangs) >>> ['张国荣', '张铁林', '张国立', '张曼玉']  #新列表中全是姓张的

字典

dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"}
lst = []
for i in dic:
    lst.append(i)
for i in lst:
    dic.pop(i)
print(dic)  >>> {}

formkeys()

直接用类(class)访问,返回新字典,对原字典没有影响

后面的value是多个key共享一个value

dic = {"apple":"苹果", "banana":"香蕉"}
print(dic.fromkeys("apple","苹果"))  
>>>
 {'a': '苹果', 'p': '苹果', 'l': '苹果', 'e': '苹果'} #形成新字典,与原字典无关联,遍历前面形成key,共享后面一个value
print(dic.fromkeys("ab",["苹果","橘子"]))
>>> 
{'a': ['苹果', '橘子'], 'b': ['苹果', '橘子']}

 

dic = {"apple":"苹果", "banana":"香蕉"}
# 返回新字典. 和原来的没关系
ret = dic.fromkeys("orange", "橘子") # 直接用字典去访问fromkeys不会对字典产生影响
ret = dict.fromkeys("abc",["哈哈","呵呵", "吼吼"]) # fromkeys直接使用类名进行访问
print(ret)
>>>
{'a': ['哈哈', '呵呵', '吼吼'], 'b': ['哈哈', '呵呵', '吼吼'], 'c': ['哈哈', '呵呵', '吼吼']}
a = ["哈哈","呵呵", "吼吼"]
ret = dict.fromkeys("abc", a) # fromkeys直接使用类名进行访问
a.append("嘻嘻")
print(ret) 
>>>
{'a': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'b': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'c': ['哈哈', '呵呵', '吼吼', '嘻嘻']}

 

set集合

特点:无顺序,不重复,里面元素是可哈希(不可变)的

作用:用来去重

本身是可变的数据类型,有增删改查操作

frozenset()冻结的集合. 不可变的. 可哈希的,冻结后集合不能再添加或删除任何元素。

s = {"周杰伦", "的老婆","叫昆凌", (1,2,3), "周杰伦"}
lst = [11,5,4,1,2,5,4,1,25,2,1,4,5,5]
s = set(lst)    # 把列表转换成集合. 进行去重复
lst = list(s)   # 把集合转换回列表.
print(lst) >>> [1, 2, 4, 5, 11, 25]  #去重

# 集合本身是可变的数据类型, 不可哈希, 有增删改查操作
s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤")    # 迭代更新 无序
print(s) >>> {'王祖贤', '关之琳', '', '', '刘嘉玲', ''}

 

深浅拷贝

赋值, 没有创建新对象. 共用同一个对象,他们是相同的,赋值后的变量指向原有的内存地址

浅拷贝.

拷贝第一层内容.不拷贝内部子对象,用 [:]或copy() 

lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
print(lst1.copy())  #浅拷贝  拷贝出来的列表第一层与原来是不同的内存地址,第二层指向原来的地址 
>>>
['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] 
print(lst1[:]) #浅拷贝  
>>> 
['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] 

深拷贝.

拷贝所有内容. 包括内部的所有,形成一个新的对象,虽然与之前的值和内容一模一样,但是它们完完全全的两个对象,用deepcopy()

lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
lst2 = copy.deepcopy(lst1)
print(lst2)   >>>  ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]]
print(id(lst1)) >>> 358961124936
print(id(lst2)) >>> 358961315656
# lst1和lst2 是两个不同内存地址的