Python字典关联deque时popleft仅首次生效问题求助
解决你的Deque Popleft仅第一次生效的问题
兄弟,我来帮你捋捋这个问题。先看看你现有代码里的小坑,再给你一个能正常跑的方案。
先揪出你代码里的问题
你创建了people1、people2、people3三个实例,但只把people1塞进了字典的deque里,people2和people3完全没加进去!这就导致初始deque里只有一个元素,第一次popleft()之后就空了,再调用要么抛异常要么没反应,看起来就像“只有第一次生效”。
另外,如果后续你不小心重新给EmployeePoint.dic["Rafael"]赋值了新的deque(比如又写了EmployeePoint.dic["Rafael"] = deque([people1])),那每次popleft后都会被重置,也会出现同样的问题。
正确的实现方式
咱们把添加元素的逻辑放进类的__init__方法里,创建实例时自动加到对应的deque里,不用手动一个个加,也不会漏。然后测试popleft的效果:
from collections import deque class EmployeePoint: dic = {} # 类共享的字典,所有实例共用 def __init__(self, name, point): self.name = name self.point = point # 初始化时自动把当前实例加到对应姓名的deque里 if name not in EmployeePoint.dic: EmployeePoint.dic[name] = deque() EmployeePoint.dic[name].append(self) # 创建三个实例,自动添加到Rafael的deque中 people1 = EmployeePoint("Rafael", "18") people2 = EmployeePoint("Rafael", "19") people3 = EmployeePoint("Rafael", "20") # 看看初始状态 print("初始deque内容:", [p.point for p in EmployeePoint.dic["Rafael"]]) # 输出 ['18', '19', '20'] # 第一次popleft first_item = EmployeePoint.dic["Rafael"].popleft() print("第一次取出的元素:", first_item.point) # 输出 18 print("第一次popleft后的deque:", [p.point for p in EmployeePoint.dic["Rafael"]]) # 输出 ['19', '20'] # 第二次popleft second_item = EmployeePoint.dic["Rafael"].popleft() print("第二次取出的元素:", second_item.point) # 输出 19 print("第二次popleft后的deque:", [p.point for p in EmployeePoint.dic["Rafael"]]) # 输出 ['20']
关键注意事项
- 别手动重复赋值deque:字典里存的是deque的引用,直接调用
append或popleft就能修改原对象,别再重新给EmployeePoint.dic["Rafael"]赋值新的deque,不然会覆盖之前的修改。 - 检查deque是否为空:调用
popleft前最好先判断一下,避免抛出异常:if EmployeePoint.dic["Rafael"]: EmployeePoint.dic["Rafael"].popleft() else: print("deque已经空啦,没法再取了!") - 自动添加元素更靠谱:把添加逻辑放进
__init__里,创建实例时自动加入deque,就不会像之前那样漏加people2和people3了。
内容的提问来源于stack exchange,提问作者Rafael Rocha
相关产品推荐
相关产品推荐

