Python函数在调试时返回值,但在运行时不返回任何值

Python函数在调试时返回值,但在运行时不返回任何值,python,function,return-value,Python,Function,Return Value,我有一个从调试器运行时可以正常工作的函数,但在其他情况下返回None class HotelRoom(object): def __init__(self, guestlst=[]): self.guestlst = guestlst def __repr__(self): if self.guestlst == []: self.guestlst.append("empty") retu

我有一个从调试器运行时可以正常工作的函数,但在其他情况下返回
None

class HotelRoom(object):
    def __init__(self, guestlst=[]):
        self.guestlst = guestlst
    def __repr__(self):
        if self.guestlst == []:
            self.guestlst.append("empty")
        return 'HotelRoom(guestlst=%r)' % self.guestlst
    def maybeFill(self, newGuests):
        # return new guestlist on success; return None on failure
        if self.guestlst == ["empty"]:
            self.guestlst = newGuests
            return self.guestlst
        return None

if __name__ == "__main__":
    h = HotelRoom()
    print(h.maybeFill(["Nathan"]))
如果我使用一个调试器,它可以正常工作,并且它的预期输出是
[“Nathan”]

如果我只是运行它,输出是
None


为什么函数的输出取决于它是否在调试器中运行?

这是因为您的
\uuuu repr\uuuu
函数更改了它应该打印的值。当您在调试器中时,调试器试图向您显示值的表示形式的行为会更改该值,方法是将
[]
更改为
['empty']

由于
maybeFill
函数将列表与
['empty']
进行比较,因此当实际值为
[]
时返回false,如果从未调用
repr()
,则返回false

一个不那么令人惊讶的
\uuuuu repr\uuuuu
将只显示该值,而不会更改它。然后,将空值保留为<代码> []/COD>而不是将其转换为<代码> [空] < /> >:

class HotelRoom(object):
    def __init__(self, guestlst=[]):
        self.guestlst = guestlst
    def __str__(self):
        if self.guestlst:
            return 'Hotel room, with guests: %s' % ', '.join(self.guestlst)
        return 'Empty hotel room'
    def __repr__(self):
        return 'HotelRoom(guestlst=%r)' % self.guestlst
    def maybeFill(self, newGuests):
        # return new guestlist on success; return None on failure
        if self.guestlst == []:
            self.guestlst = newGuests
            return self.guestlst
        return None

if __name__ == "__main__":
    h = HotelRoom()
    if h.maybeFill(["Nathan", "John"]) == None:
        print("If you see this, the problem is not solved")
    print(h)

正如您在的在线解释器中所看到的,即使没有调试器导致提前调用
\uuuu repr\uuuu
\uuuu str\uuuu
时,上述功能仍然有效。

请提供一个我们可以从您的问题中复制并在解释器/ide中运行的程序。你需要为我们做这项工作。如果函数返回None,则
check\u guest
为False。如果check\u guest:或
self.hotel\u rooms
为空或
(checked\u rooms.better\u than(check\u guest)和…
正在计算False.Chained布尔运算,
checked\u rooms.better\u than(check\u guest)和checked\u rooms.guestslst=[“empty”]
,似乎经常被问到-把你想要的操作分组/执行的方式放在周围。@wwii-添加了一个demo@CharlesDuffy您是否偶然打开了pastebin?其中一半只是类定义,这是必需的,我已经省略了大部分代码,所以当它运行时-但是感谢您的帮助建议我已经编辑了它一个合适的,如果它被重新打开(除非其他人先到那里)会回答的。虽然你对我的帖子的编辑与原文相差太远,很难修改,但是你关于['empty']vs[]这就是解决方案。关于str——遗憾的是,它是python初学者课程中给出的作业的一部分,我们被明确告知要使用repr……原始版本太长,太曲折,无法成为一个解决方案;构建生成相同问题的尽可能短的代码是您在提问时需要做的一部分。下次,如果您这样做的话那就是你自己,你不需要别人来帮你。