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

Python类方法修改属性后程序无限运行无输出,求原因

问题分析与解决

核心原因

每次进入while循环时,你都会重新创建一个Geek类的实例uaac,而每个新实例的life属性都会被初始化回1000。哪怕执行了countdown()方法,也只是把这个新实例的life减少了b的值(初始为1,后续可能变为10),但下一次循环又会生成全新的实例,life再次回到1000,永远达不到<=0的终止条件,因此循环会无限运行。

修复方案

将Geek实例的创建移到while循环外部,让整个循环复用同一个实例,这样life属性才会持续累计减少:

import random

b = 1
count = 0
n = 0  #initialise variables

class Geek:
    def __init__(self):
      self.life = 1000 #declare attribute
  
    def countdown(self):
      self.life = self.life - b  #countdown reduces life by 1 each time at first
      global n
      n = n + random.randint(1,10)

# 将实例化操作移到循环外,复用同一个实例
uaac = Geek()
while True:
  count = count + 1
  if n > 40:
    b = 10 #countdown will be faster
  uaac.countdown()
  if uaac.life <= 0:
    print(count) #if b doesn't change to 10 this will be 1000
    break

补充说明

  • 原逻辑的错误点在于实例生命周期管理:循环内重复创建实例导致life无法累计减少,始终处于「初始值 - 单次减少量」的状态,永远无法触发终止条件。
  • 调整后,同一个实例的life会在每次countdown()调用后持续降低,直到满足<=0的条件,循环正常终止并输出count。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:35:21