Python列表硬币翻转获连续3正面时程序崩溃问题排查
问题:硬币翻转程序报错UnboundLocalError
需求是实现Python列表中的硬币翻转操作,直到出现连续3次正面。目前能完成列表填充,但调用flip函数时崩溃,报错UnboundLocalError: local variable 'headsCount' referenced before assignment。
错误栈
Traceback (most recent call last): File "/home/unseensnick/VS Code Projects/python projects/java assignments in python/assignment_3/Main.py", line 46, in <module> case 1: coinsThreeInARow() File "/home/unseensnick/VS Code Projects/python projects/java assignments in python/assignment_3/Main.py", line 25, in coinsThreeInARow flip = coins[i].flip() File "/home/unseensnick/VS Code Projects/python projects/java assignments in python/assignment_3/Coins.py", line 11, in flip while (headsCount < 3): UnboundLocalError: local variable 'headsCount' referenced before assignment
提供的代码
Main.py
from Coins import Coins currentWinner = 9223372036854775807 winningCoin = "" winnerCount = 0 num = 1 coins = [] answer = int(input("how many coins do you want to flip? ")) #populate list for i in range(0, answer): ele = num+1 coins.append(Coins(ele)) #flip coins in list #doesn't work at the moment for i in range(0, len(coins)): flip = coins[i].flip() if (flip < currentWinner): currentWinner = flip winningCoin = coins[i].getName() winnerCount = i print(winningCoin+" is the winner.");
Coins.py
import math class Coins: def __init__(self, num): self.name = "c",num self.count = 0 def flip(self): self.count while (headsCount < 3): face = (int)(math.random() * 2); # range [0, 1] self.count+=1 if (face == 0): headsCount+=1 else: headsCount = 0; print("name: "+self.name+" count: "+self.count); return self.count def getName(self): return self.name def isHeads(self): return (self.face == self.HEADS);
问题分析与修复
核心错误原因
flip方法里的headsCount变量未初始化就直接使用,Python将其判定为局部变量,但while判断时它还未赋值,因此抛出UnboundLocalError。
其他潜在问题
self.name = "c",num会生成元组,后续字符串拼接会报错,需改为字符串格式- Python生成随机数应使用
random模块,math.random()不是标准用法 self.count为无效语句,无实际作用- 整数
self.count无法直接与字符串拼接,需做类型转换或使用格式化字符串 isHeads方法中的self.face和self.HEADS未定义,调用会报错
修复后的Coins.py代码
import random class Coins: def __init__(self, num): self.name = f"c{num}" self.count = 0 def flip(self): headsCount = 0 # 初始化连续正面计数 self.count = 0 # 每次翻转前重置总次数 while headsCount < 3: face = random.randint(0, 1) # 生成0或1的随机数,0代表正面 self.count += 1 if face == 0: headsCount += 1 else: headsCount = 0 print(f"name: {self.name} count: {self.count}") return self.count def getName(self): return self.name
优化后的Main.py代码
from Coins import Coins currentWinner = float('inf') # 用inf代替超大数更合理 winningCoin = "" answer = int(input("你想翻转多少枚硬币? ")) coins = [] for i in range(answer): coins.append(Coins(i+1)) # 直接用索引+1作为硬币编号,逻辑更清晰 for coin in coins: flip_count = coin.flip() if flip_count < currentWinner: currentWinner = flip_count winningCoin = coin.getName() print(f"{winningCoin} 是获胜者。")
内容的提问来源于stack exchange,提问作者Snickers
相关产品推荐
相关产品推荐

