Python水桶倒水函数异常求助:倒水未按预期停止
你的水桶倒水代码异常问题分析与修复
嘿,作为编程新手碰到这种循环逻辑的坑太正常了,咱们一步步拆解你的问题,找出异常的根源:
核心问题:循环条件与内部判断逻辑错误
你的异常输出里水桶1的水量超过了3L的容量,而且停不下来,完全是pour_water函数里的逻辑出了问题,咱们逐行看:
1. 错误的循环条件
你写的循环条件是:
while g_bucket.capcity >= g_bucket.water or p_bucket.water != -1:
这里的or是致命错误——只要两个条件里有一个成立,循环就会继续。哪怕目标桶已经满了(g_bucket.water == g_bucket.capcity),只要p_bucket.water != -1(而你的代码里从来没把水量设为-1),循环就会一直跑,导致目标桶水量超过容量。
正确的循环逻辑应该是:只有当目标桶还没满,并且源桶还有水的时候,才继续倒水,所以循环条件应该用and:
while g_bucket.water < g_bucket.capacity and p_bucket.water > 0:
2. 混乱的内部判断逻辑
你内部的if判断不仅多余,还有逻辑错误:
if g_bucket.capcity != g_bucket.water or p_bucket.water != -1: if g_bucket.capcity < g_bucket.water: bucket.water = g_bucket.capcity break
- 首先,外层的
if判断和循环条件重复,完全没必要; - 其次
g_bucket.capcity < g_bucket.water是判断目标桶水量超过容量,但这时候你才去设置容量,逻辑完全搞反了——而且你用了bucket.water(类名)而不是g_bucket.water(实例),这会错误修改类的属性,而不是当前目标桶的水量; - 最后,
p_bucket.water != -1这个判断完全没有依据,你的代码里从来没有把水桶水量初始化为-1的逻辑,属于多余的干扰项。
3. 额外的小问题:fill_water函数的写法
你把fill_water写成了独立函数,但它本质是水桶的行为,应该放到bucket类里面作为实例方法,这样调用更符合面向对象的规范。
修正后的完整代码
# 定义bucket类 class Bucket: # 类名建议首字母大写,符合PEP8规范 def __init__(self, water, capacity): self.water = water self.capacity = capacity # 修正拼写错误:capcity → capacity # 把fill_water放到类里作为实例方法 def fill_water(self): self.water = self.capacity # 创建实例 bucket1 = Bucket(0, 3) bucket2 = Bucket(0, 5) # 打印水量函数 def pr_v(): print(f"Bucket_ONE {bucket1.water}L") print(f"Bucket_TWO {bucket2.water}L") print(" ") # 修正后的倒水函数 def pour_water(p_bucket, g_bucket): # 循环条件:目标桶未满,且源桶有水 while g_bucket.water < g_bucket.capacity and p_bucket.water > 0: p_bucket.water -= 1 g_bucket.water += 1 pr_v() # 调用类方法填满水桶2 bucket2.fill_water() pour_water(bucket2, bucket1) pr_v()
修正后的运行结果
Bucket_ONE 1L Bucket_TWO 4L Bucket_ONE 2L Bucket_TWO 3L Bucket_ONE 3L Bucket_TWO 2L Bucket_ONE 3L Bucket_TWO 2L
完全符合你的预期——当bucket1到达3L容量时,循环自动停止,不会再继续倒水。
总结错误点
- 循环条件误用
or代替and,导致循环无法在目标桶满时终止; - 内部判断逻辑混乱,还出现了类名访问实例属性的错误;
- 引入了无意义的
p_bucket.water != -1判断,干扰了循环逻辑; - 拼写错误:
capcity应该是capacity(虽然不影响运行,但规范很重要)。
内容的提问来源于stack exchange,提问作者Raz P
相关产品推荐
相关产品推荐

