Python Queue实例仅在Debug断点后正常打印输出问题求助
调试模式下才正常输出队列内容的问题
执行print(filaOverbooking)语句时,只有在Debug模式下为该语句设置断点,查看filaOverbooking变量详情(初始显示{...},切换其他内容后再次查看才会展示完整数据),之后继续运行代码,print才能正常输出内容;否则直接运行代码,print会输出空内容。
主程序代码
from linkedlist import LinkedList from queuePas import Queue from passageiro import Passageiro import random # 原代码遗漏此导入,直接运行会报错 listaPassageiros = LinkedList() filaOverbooking = Queue() def gerarPassageiro(qtdPassageiros, statusPass): for x in range(1, qtdPassageiros + 1): listaNomes = ['Miguel', 'Arthur', 'Theo', 'Heitor', 'Gael', 'Davi', 'Bernardo', 'Gabriel', 'Ravi', 'Noah', 'Samuel','Pedro', 'Benicio','Benjamin','Matheus', 'Isaac','Anthony' , 'Joaquim', 'Lucas','Lorenzo' , 'Rafael', 'Nicolas', 'Henrique', 'Murilo', 'Miguel', 'Lucca', 'Guilherme', 'Henry', 'Bryan', 'Gustavo', 'Felipe', 'Pietro', 'Levi', 'Daniel', 'Bento', 'Vicente', 'Leonardo', 'Caleb', 'Pedro', 'Matteo', 'Gabriel', 'Joao', 'Antonio', 'Emanuel', 'Enzo', 'Davi', 'Caio', 'Eduardo', 'Lucas'] listaSobrenomes = ['Silva', 'Santos', 'das Dores', 'Pinto', 'Coelho', 'Oliveira', 'Souza', 'Alves', 'Lima', 'Pereira', 'Burgarelli', 'de Jesus', 'dos Reis', 'Gomes', 'Costa', 'Martins', 'Ribeiro', 'Almeida', 'Carvalho', 'Lopes', 'Fernandes'] listaRuas = ['Rua 10 de Abril', 'Rua Adelina Dossi Becevelli', 'Avenida Adolfo Correia da Silva', 'Travessa Advalter Braganca', 'Rua Afonso Claudio', 'Rua Alexandre Vargas', 'Beco Alexandrino Coelho Araujo', 'Rua Alfredo Pereira de Chagas', 'Rua Alice Laranja', 'Rua Alice Nunes Kull', 'Rua Algas Marinhas', 'Avenida Esperanca', 'Rua Ana Pestana'] listaCidades = ['Colatina', 'Vitoria', 'Vilha-Velha', 'Linhares', 'Serra', 'Guarapari', 'Afonso Pena'] cpf = str(random.randint(10000000000, 11000000000)) rg = str(random.randint(1000000, 1100000)) celular = str(random.randint(990000000, 999999999)) telefone = str(random.randint(10000000, 20000000)) numero = str(random.randrange(1,3000)) endereco = f"{listaRuas[random.randint(0, len(listaRuas)-1)]}, {numero}, {listaCidades[random.randint(0, len(listaCidades)-1)]}, ES" assento = str(x) if statusPass == "Overbooking": passageiro = Passageiro( listaNomes[random.randint(0, len(listaNomes)-1)], listaSobrenomes[random.randint(0, len(listaSobrenomes)-1)], cpf, rg, endereco, celular, telefone ) filaOverbooking.push(passageiro) elif statusPass == "Confirmado": passageiro = Passageiro( listaNomes[random.randint(0, len(listaNomes)-1)], listaSobrenomes[random.randint(0, len(listaSobrenomes)-1)], cpf, rg, endereco, celular, telefone, statusPass, assento ) listaPassageiros.addNode(passageiro) gerarPassageiro(10, "Overbooking") print(filaOverbooking)
Passageiro类代码
class Passageiro: def __init__(self, nome, sobrenome, cpf, rg, endereco, telCelular, telFixo, statusVoo="Overbooking", assento="-"): self.nome = nome self.sobrenome = sobrenome self.cpf = cpf self.rg = rg self.endereco = endereco self.telCelular = telCelular self.telFixo = telFixo self.statusVoo = statusVoo self.assento = assento def __repr__(self): return ( f"Nome: {self.nome}\n" f"Sobrenome: {self.sobrenome}\n" f"cpf: {self.cpf}\n" f"rg: {self.rg}\n" f"endereco: {self.endereco}\n" f"Celular: {self.telCelular}\n" f"Telefone: {self.telFixo}\n" f"Status do Voo: {self.statusVoo}\n" f"Assento: {self.assento}\n" "--------------------------------------\n" ) def __str__(self): return self.__repr__()
Queue类代码
from queuenode import QueueNode class Queue: def __init__(self): self.first = None self.last = None self._size = 0 self.maxSize = 10 self.queueIterator = self.first # 问题根源:依赖实例变量维护迭代状态 def push(self, elem): if self._size < self.maxSize: node = QueueNode(elem) if self.first is None and self.last is None: self.first = node self.last = node else: self.last.next = node self.last = node self._size += 1 else: raise IndexError("Can't add. The queue is full") def pop(self): if self._size > 0: elem = self.first.data self.first = self.first.next self._size -= 1 return f"{elem} removed from queue" raise IndexError("Can't remove. The queue is empty") def peek(self): if self._size > 0: return self.first.data raise IndexError("The queue is empty") def __len__(self): return self._size def nextNode(self): self.queueIterator = self.queueIterator.next if not self.queueIterator: self.queueIterator = None def __repr__(self): fila = "" posicao = 1 while self.queueIterator: fila += f"{posicao}: {self.queueIterator.data}" self.nextNode() posicao += 1 fila = fila.strip(", ") self.queueIterator = self.first return fila def __str__(self): return self.__repr__()
断点后的示例输出
1: Nome: Matheus Sobrenome: Carvalho cpf: 10947455233 rg: 1082637 endereco: Rua Alice Nunes Kull, 147, Vitoria, ES Celular: 995282420 Telefone: 17498892 Status do Voo: Overbooking Assento: - -------------------------------------- 2: Nome: Anthony Sobrenome: Lopes cpf: 10314633731 rg: 1028954 endereco: Rua 10 de Abril, 2747, Colatina, ES Celular: 994457278 Telefone: 12448801 Status do Voo: Overbooking Assento: - --------------------------------------
问题原因与修复方案
核心问题
Queue类的__repr__方法依赖实例变量queueIterator遍历队列,但该变量仅在初始化时设为self.first,后续添加元素时不会自动更新。直接运行时,queueIterator始终是None,导致循环不执行,输出空字符串。而Debug模式下查看变量时,调试器的操作会意外重置queueIterator,使得后续print能正常输出。
修复代码
修改Queue类的__repr__方法,使用局部变量遍历队列,避免依赖实例状态:
def __repr__(self): fila = "" posicao = 1 current = self.first # 使用局部变量遍历,不影响实例状态 while current: fila += f"{posicao}: {current.data}" current = current.next posicao += 1 return fila.strip()
同时可移除不必要的queueIterator实例变量和nextNode方法,若需迭代功能,建议实现Python标准迭代器协议(__iter__和__next__方法)。
另外需修正主程序的两个问题:补充import random、修正列表变量的缩进错误。
内容的提问来源于stack exchange,提问作者Victor Burgarelli
相关产品推荐
相关产品推荐

