nametuple、dequeue、queue.Queue、深淺拷貝常用方法解析


tuple元組中元素的訪問方法為通過下標索引來獲取對應的值,可命名元組可以通過創建類來是實現對元組的元素值進行命名來實現通過名稱訪問元組的值

但是需要引用collections中的nametuple方法來實現,具體例子如下:

import collections;
#相當於創建類,然后通過創建類的對象來實現
MyTupleClass=collections.namedtuple("MyTupleClass",["x","y","z"])
mt=MyTupleClass(11,22,33)
print(mt.x,mt.y,mt.z)

dequeue雙向隊列,該隊列也是collections方法之一,該隊列可以實現元素的左右添加刪除,指定位置的添加刪除,很多方法與列表類似,不似真正的隊列

name1="雙向隊列相關方法及使用"
print(name1.center(60,"*"))
d=collections.deque()
d.append(1)
d.appendleft(100)
print("在左邊追加元素后為:",d)
d.append(1)
print(d)
print("1出現的次數為:",d.count(1))
d.extend([11,222])
print("擴展后的隊列為:",d)
d.extendleft([999,888])
print("左邊擴展后的隊列為:",d)
l=d.index(100)
print("100所在的位置是:",l+1)
d.insert(3,111111)
print("在第四個位置插入元素11111:",d)
d.remove(11)
print("刪除元素11后的隊列為:",d)
d.rotate(4)
print("將隊列的后四個元素提到前面來:",d)

單向隊列queue,隊列中的元素通過put和get方法來實現存取,先進先出(一頭進,另外一頭出)

#創建單向隊列
import queue
q=queue.Queue()
q.put("123")
q.put("567")
print("隊列的長度為:",q.qsize())
print("取出隊列中的元素(先進先出):",q.get())

賦值、深淺拷貝:對於 數字 和 字符串 而言,賦值、淺拷貝和深拷貝無意義,因為其永遠指向同一個內存地址。

對於其他基本數據類型:

賦值:只是創建一個變量,該變量指向原來內存地址

淺拷貝:在內存中只額外創建第一層數據

深拷貝,在內存中將所有的數據重新創建一份(排除最后一層,即:python內部對字符串和數字的優化)

 

#深淺拷貝、賦值
import copy
#淺拷貝
# copy.copy()
# #深拷貝
# copy.deepcopy()
#賦值 ==

print("數字、字符串無論深淺拷貝、賦值均用同一地址")
a=121321324234
str1="wewqewewe"
a1=a
print("賦值:")
print(id(a1))
print(id(a))
a2=copy.copy(a)
a3=copy.deepcopy(a)
print("深淺拷貝:")
print(id(a2))
print(id(a3))

dic={"k1":"v1","k2":"v2","k3":["alex",456]}
dic1=dic
print("賦值:")
print(id(dic))
print(id(dic1))
dic2=copy.copy(dic)
print("淺拷貝:")
print(id(dic2))
print(id(dic))
print("查看拷貝的層數(由結果可看出只拷貝了一層):")
print(id(dic["k3"]))
print(id(dic2["k3"]))
print("深拷貝:")
dic3=copy.deepcopy(dic)
print(id(dic3))
print(id(dic))
print("查看拷貝的層數(由結果可看出拷貝了多層):")
print(id(dic["k3"]))
print(id(dic3["k3"]))

#深淺拷貝的應用
dic={
    "cpu":[80,],
    "mem":[80,],
    "disk":[80]
}
print("before:",dic)
# new_dic=copy.copy(dic)
# new_dic["cpu"][0]=50
# print("淺拷貝,查看原字典是否改變:",dic)
# print("查看新的字典:",new_dic)
# print("結論:由於淺拷貝只拷貝一層,故當發生改變時,原有元素的地址也被改變")
new_dic1=copy.deepcopy(dic)
new_dic1["cpu"][0]=50
print("深拷貝,查看原字典是否改變:",dic)
print("查看新的字典:",new_dic1)
print("結論:由於深拷貝拷貝多層,故當發生改變時,原有元素的地址不變")

 


免責聲明!

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



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