2013-08-29 262 views
2

我正在尝试制作一个程序,用于计算6-9-20包中无法获得的最大对象数量(块)(我对python相当陌生,我试图使用全局和非本地,但它也不工作)。NameError:未定义全局名称'cb'

def nuggets(n): 
    x = 6 
    y = 9 
    z = 20 
    for i in range(0,n//x+1): 
     for j in range(0,n//y+1): 
      for k in range(0,n//z+1): 
       if i*x + j*y + k*z == n: 
        return [i,j,k] 
    return None 

def cant_buy(n): 
    seq=0 
    for i in range(n): 
     p=nuggets(i) 
     if type(p)== list: 
      seq+=1 
     elif type(p)== None: 
      cb=i 
      seq=0 
    return cb 

然后会出现这样的错误: 回溯(最近最后一次通话): 文件 “”,1号线,在 cant_buy(12) 文件 “C:\ Python33 \ OCW 6.00 \ ps2a.py” ,第22行,在cant_buy 返回cb NameError:全局名称'cb'未定义

出错了?我在elif语句中定义了它。

+1

您的cb是在循环/分支语句中声明/分配的。 如果这些路径未被触及,则cb变量不会被创建。 – Anycorn

+0

您是否尝试过函数内的代码?我尝试了掘金的开始,我得到了: >>> x = 6 >>> y = 9 >>> z = 20 >>>范围(0,n // x + 1) [ 0] >>>范围(0,N // Y + 1) [0] >>>范围(0,N // Z + 1) [0] 不是以为我就是你通缉。 – thefourtheye

+0

如果您用您的意图逐行添加注释,我们可能会帮助您解决问题。我怀疑多个bug会导致cb保持未创建状态。 – thefourtheye

回答

1

当我运行你的代码时,我得到了一个稍微不同但可能更澄清的错误信息。它说: “UnboundLocalError:本地变量'cb'在赋值之前引用”

因此,Python试图使用一个未知的变量。

来声明变量“CB”你在循环使用它之前,像这样:

def cant_buy(n): 
    cb = 0 # <---- insert this 
    seq=0 
    for i in range(n): 
     p=nuggets(i) 
     if type(p)== list: 
      seq+=1 
     elif type(p)== None: 
      cb=i 
      seq=0 
    return cb 

应该做的伎俩。

相关问题