python中的深淺拷貝(copy)


字符串中的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 是兩個不同內存地址的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM