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

Python函数重复执行问题:循环执行20次而非预期10次

问题解决:阻止函数重复执行并保留正确得分统计

你的代码之所以会跑20轮,核心原因是你调用了两次determineWinner函数:

  • 第一次是在用户输入判断的外部:winsP1, winsP2 = determineWinner(winsP1 = winsP1, winsP2 = winsP2),这已经跑了10轮
  • 第二次是在用户输入确认要游戏的if分支里,又调用了一次determineWinner(winsP1, winsP2),而且这次调用的结果没赋值回变量,等于白跑10轮,还让输出翻倍

修改方案

直接删掉外部的那次函数调用,只在用户确认游戏的分支里调用,并且把返回的得分赋值回变量,同时优化一些细节:

import random
import time

# 优化输入判断,更简洁
answer = input("Play the game?").strip().lower()

winsP1 = 0
winsP2 = 0

def determineWinner(winsP1, winsP2):
    # 把导入移到函数外面,不要在循环里重复导入
    for _ in range(10):
        player1 = random.randint(1,10)
        player2 = random.randint(1,10)
        print("Player 1:", player1)
        print("Player 2:", player2)
        if player1 == player2:
            print("This round is a tie!")
            winsP1 += 1
            winsP2 += 1
        elif player1 > player2:
            print("Player 1 wins this round!")
            winsP1 += 1
        else:
            print("Player 2 wins this round!")
            winsP2 += 1         
    return winsP1, winsP2

if answer in {"y", "yes"}:
    # 只在这里调用一次,并且把返回的得分赋值回变量
    winsP1, winsP2 = determineWinner(winsP1, winsP2)
    
    # 输出最终统计结果
    print("\nThe score totals are:")
    print(f"Player one: {winsP1}")
    print(f"Player two: {winsP2}\n")
    if winsP1 > winsP2:
        print(f"Player 1 wins with a score of {winsP1}!")
    elif winsP2 > winsP1:
        print(f"Player 2 wins with a score of {winsP2}!")
    else:
        print("It's a tie!")

修改关键点说明

  1. 删除多余的函数调用:只保留用户确认游戏后的那一次调用,确保仅执行10轮游戏
  2. 保留得分赋值:函数返回的winsP1和winsP2必须赋值回全局变量,否则统计结果不会更新
  3. 优化输入判断:用strip().lower()统一输入格式,再判断是否在允许的集合里,比多个or更简洁
  4. 避免重复导入:把randint的导入移到函数外,不要在循环里重复导入模块,这是不良编程习惯
  5. 简化循环变量:循环变量用_代替wins,因为这个变量没被用到,更符合Python规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:55:22