You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:20:48