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("结论:由于深拷贝拷贝多层,故当发生改变时,原有元素的地址不变")

 

posted @ 2016-10-10 19:56  Eric9  阅读(2550)  评论(0编辑  收藏  举报