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

循环累加变量时变量持续重置为0的Python问题排查

解决Trivia问答游戏分数无法累计的问题

你的核心问题是每次递归调用questionmaker()时,都会重新定义PlayerPoints = 0,导致之前累计的分数被重置。下面是几种简单有效的修正方案:

方案1:将分数作为递归参数传递

修改函数,让它接受一个可选的分数参数,默认值为0。每次答对后,把更新后的分数传入下一次递归调用:

from random import randrange
WDCs = ((2023, "Max Verstappen"), (2022, "Max Verstappen"),
        (2021, "Max Verstappen"), (2020, "Lewis Hamilton"),
        (2019, "Lewis Hamilton"), (2018, "Lewis Hamilton"),
        (2017, "Lewis Hamilton"), (2016, "Nico Rosberg"),
        (2015, "Lewis Hamilton"), (2014, "Lewis Hamilton"),
        (2013, "Sebastian Vettel"), (2012, "Sebastian Vettel"),
        (2011, "Sebastian Vettel"), (2010, "Sebastian Vettel"),
        (2009, "Jenson Button"), (2008, "Lewis Hamilton"),
        (2007, "Kimi Raikkonen"), (2006, "Fernando Alonso"),
        (2005, "Fernando Alonso"), (2004, "Michael Schumacher"),
        (2003, "Michael Schumacher"), (2002, "Michael Schumacher"),
        (2001, "Michael Schumacher"), (2000, "Michael Schumacher"),
        (1999, "Mike Hakkinen"), (1998, "Mika Hakkinen"),
        (1997, "Jaques Villeneuve"), (1996, "Damon Hill"),
        (1995, "Michael Schumacher"), (1994, "Michael Schumacher"),
        (1993, "Alain Prost"), (1992, "Nigel Mansell"),
        (1991, "Ayrton Senna"), (1990, "Ayrton Senna"),
        (1989, "Alain Prost"), (1988, "Ayrton Senna"),
        (1987, "Nelson Piquet"), (1986, "Alain Prost"),
        (1986, "Alain Prost"), (1985, "Alain Prost"),
        (1984, "Niki Lauda"), (1983, "Nelson Piquet"),
        (1982, "Keke Rosberg"), (1981, "Nelson Piquet"),
        (1980, "Alan Jones"), (1979, "Jody Scheckter"),
        (1978, "Mario Andretti"), (1977, "Niki Lauda"),
        (1976, "James Hunt"), (1975, "Niki Lauda"),
        (1974, "Emerson Fittipaldi"), (1973, "Jackie Stewart"),
        (1972, "Emerson Fittipaldi"), (1971, "Jackie Stewart"),
        (1970, "Jochen Rindt"), (1969, "Jackie Stewart"),
        (1968, "Graham Hill"), (1967, "Denny Hulme"),
        (1966, "Jack Brabham"), (1965, "Jim Clark"),
        (1964, "John Surtees"), (1963, "Jim Clark"),
        (1962, "Graham Hill"), (1961, "Phil Hill"),
        (1960, "Jack Brabham"), (1959, "Jack Brabham"),
        (1958, "Jack Hawthorn"), (1957, "Juan Manuel Fangio"),
        (1956, "Juan Manuel Fangio"), (1955, "Juan Manuel Fangio"),
        (1954, "Juan Manuel Fangio"), (1953, "Alberto Ascari"),
        (1952, "Alberto Ascari"), (1951, "Juan Manuel Fangio"),
        (1950, "Giusepe Farina")
        )

def questionmaker(player_points=0):
    LocalWDC = WDCs[randrange(73)]
    print(f"Who won the World Championship in {LocalWDC[0]}? ")
    PlayerResponse = input().strip()
    if PlayerResponse == LocalWDC[1]:
        player_points += 5
        print("That's Correct!")
        print(f"Your score is {player_points}!")
        return questionmaker(player_points)
    else:
        print(f"Wrong! The Champion that year was {LocalWDC[1]}.")
        print(f"Your Final Score is {player_points}!")

questionmaker()

方案2:用while循环替代递归(更推荐)

递归并不适合这种无限循环场景(如果用户一直答对,会触发Python的递归深度限制),改用while循环更稳妥,分数变量可以在循环外维护:

from random import randrange
WDCs = ((2023, "Max Verstappen"), (2022, "Max Verstappen"),
        (2021, "Max Verstappen"), (2020, "Lewis Hamilton"),
        (2019, "Lewis Hamilton"), (2018, "Lewis Hamilton"),
        (2017, "Lewis Hamilton"), (2016, "Nico Rosberg"),
        (2015, "Lewis Hamilton"), (2014, "Lewis Hamilton"),
        (2013, "Sebastian Vettel"), (2012, "Sebastian Vettel"),
        (2011, "Sebastian Vettel"), (2010, "Sebastian Vettel"),
        (2009, "Jenson Button"), (2008, "Lewis Hamilton"),
        (2007, "Kimi Raikkonen"), (2006, "Fernando Alonso"),
        (2005, "Fernando Alonso"), (2004, "Michael Schumacher"),
        (2003, "Michael Schumacher"), (2002, "Michael Schumacher"),
        (2001, "Michael Schumacher"), (2000, "Michael Schumacher"),
        (1999, "Mike Hakkinen"), (1998, "Mika Hakkinen"),
        (1997, "Jaques Villeneuve"), (1996, "Damon Hill"),
        (1995, "Michael Schumacher"), (1994, "Michael Schumacher"),
        (1993, "Alain Prost"), (1992, "Nigel Mansell"),
        (1991, "Ayrton Senna"), (1990, "Ayrton Senna"),
        (1989, "Alain Prost"), (1988, "Ayrton Senna"),
        (1987, "Nelson Piquet"), (1986, "Alain Prost"),
        (1986, "Alain Prost"), (1985, "Alain Prost"),
        (1984, "Niki Lauda"), (1983, "Nelson Piquet"),
        (1982, "Keke Rosberg"), (1981, "Nelson Piquet"),
        (1980, "Alan Jones"), (1979, "Jody Scheckter"),
        (1978, "Mario Andretti"), (1977, "Niki Lauda"),
        (1976, "James Hunt"), (1975, "Niki Lauda"),
        (1974, "Emerson Fittipaldi"), (1973, "Jackie Stewart"),
        (1972, "Emerson Fittipaldi"), (1971, "Jackie Stewart"),
        (1970, "Jochen Rindt"), (1969, "Jackie Stewart"),
        (1968, "Graham Hill"), (1967, "Denny Hulme"),
        (1966, "Jack Brabham"), (1965, "Jim Clark"),
        (1964, "John Surtees"), (1963, "Jim Clark"),
        (1962, "Graham Hill"), (1961, "Phil Hill"),
        (1960, "Jack Brabham"), (1959, "Jack Brabham"),
        (1958, "Jack Hawthorn"), (1957, "Juan Manuel Fangio"),
        (1956, "Juan Manuel Fangio"), (1955, "Juan Manuel Fangio"),
        (1954, "Juan Manuel Fangio"), (1953, "Alberto Ascari"),
        (1952, "Alberto Ascari"), (1951, "Juan Manuel Fangio"),
        (1950, "Giusepe Farina")
        )

def questionmaker():
    player_points = 0
    while True:
        LocalWDC = WDCs[randrange(73)]
        print(f"Who won the World Championship in {LocalWDC[0]}? ")
        PlayerResponse = input().strip()
        if PlayerResponse == LocalWDC[1]:
            player_points += 5
            print("That's Correct!")
            print(f"Your score is {player_points}!")
        else:
            print(f"Wrong! The Champion that year was {LocalWDC[1]}.")
            print(f"Your Final Score is {player_points}!")
            break

questionmaker()

方案3:嵌套函数维护状态

通过外层函数初始化分数,内层函数处理提问逻辑,内层可以直接访问外层的player_points变量:

from random import randrange
WDCs = ((2023, "Max Verstappen"), (2022, "Max Verstappen"),
        (2021, "Max Verstappen"), (2020, "Lewis Hamilton"),
        (2019, "Lewis Hamilton"), (2018, "Lewis Hamilton"),
        (2017, "Lewis Hamilton"), (2016, "Nico Rosberg"),
        (2015, "Lewis Hamilton"), (2014, "Lewis Hamilton"),
        (2013, "Sebastian Vettel"), (2012, "Sebastian Vettel"),
        (2011, "Sebastian Vettel"), (2010, "Sebastian Vettel"),
        (2009, "Jenson Button"), (2008, "Lewis Hamilton"),
        (2007, "Kimi Raikkonen"), (2006, "Fernando Alonso"),
        (2005, "Fernando Alonso"), (2004, "Michael Schumacher"),
        (2003, "Michael Schumacher"), (2002, "Michael Schumacher"),
        (2001, "Michael Schumacher"), (2000, "Michael Schumacher"),
        (1999, "Mike Hakkinen"), (1998, "Mika Hakkinen"),
        (1997, "Jaques Villeneuve"), (1996, "Damon Hill"),
        (1995, "Michael Schumacher"), (1994, "Michael Schumacher"),
        (1993, "Alain Prost"), (1992, "Nigel Mansell"),
        (1991, "Ayrton Senna"), (1990, "Ayrton Senna"),
        (1989, "Alain Prost"), (1988, "Ayrton Senna"),
        (1987, "Nelson Piquet"), (1986, "Alain Prost"),
        (1986, "Alain Prost"), (1985, "Alain Prost"),
        (1984, "Niki Lauda"), (1983, "Nelson Piquet"),
        (1982, "Keke Rosberg"), (1981, "Nelson Piquet"),
        (1980, "Alan Jones"), (1979, "Jody Scheckter"),
        (1978, "Mario Andretti"), (1977, "Niki Lauda"),
        (1976, "James Hunt"), (1975, "Niki Lauda"),
        (1974, "Emerson Fittipaldi"), (1973, "Jackie Stewart"),
        (1972, "Emerson Fittipaldi"), (1971, "Jackie Stewart"),
        (1970, "Jochen Rindt"), (1969, "Jackie Stewart"),
        (1968, "Graham Hill"), (1967, "Denny Hulme"),
        (1966, "Jack Brabham"), (1965, "Jim Clark"),
        (1964, "John Surtees"), (1963, "Jim Clark"),
        (1962, "Graham Hill"), (1961, "Phil Hill"),
        (1960, "Jack Brabham"), (1959, "Jack Brabham"),
        (1958, "Jack Hawthorn"), (1957, "Juan Manuel Fangio"),
        (1956, "Juan Manuel Fangio"), (1955, "Juan Manuel Fangio"),
        (1954, "Juan Manuel Fangio"), (1953, "Alberto Ascari"),
        (1952, "Alberto Ascari"), (1951, "Juan Manuel Fangio"),
        (1950, "Giusepe Farina")
        )

def questionmaker():
    player_points = 0
    def ask_question():
        nonlocal player_points
        LocalWDC = WDCs[randrange(73)]
        print(f"Who won the World Championship in {LocalWDC[0]}? ")
        PlayerResponse = input().strip()
        if PlayerResponse == LocalWDC[1]:
            player_points += 5
            print("That's Correct!")
            print(f"Your score is {player_points}!")
            ask_question()
        else:
            print(f"Wrong! The Champion that year was {LocalWDC[1]}.")
            print(f"Your Final Score is {player_points}!")
    ask_question()

questionmaker()

额外优化提示

  • 给input()添加.strip(),可以忽略用户输入的前后空格,提升回答容错性
  • 修正原WDCs数据里的拼写错误,比如Michael Schimacher(2002年)、Phil hill(1961年)、ALberto Ascari(1952年),这些错误会导致用户输入正确答案也被判错

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:04:55