Skip to main content
 首页 » 编程设计

未定义函数全局名称中的 Python 静态变量

2025年05月04日13jpfss

我编写了一个函数,仅当车辆报告它正在移动并且车辆在两点之间移动了 20 厘米时才计算两点之间的航向。

该函数使用静态变量 - 或者至少如果它有效的话 - 来跟踪以前的位置和航向值。

代码如下:

def withCan(pos): 
 
    eastdist = pos[0]-previous_pos[0] 
    northdist = pos[1]-previous_pos[1] 
    canflag = pos[2] 
 
    if (canflag == 1 or canflag==2): 
 
        if (previous_canflag == 1 and canflag == 2): 
            previous_heading += 180.0 
            previous_canflag = canflag 
        elif (previous_canflag == 2 and canflag == 1): 
            previous_heading += 180.0 
            previous_canflag = canflag 
        else: 
            previous_canflag = canflag 
 
    if ( (canflag == 1 or canflag == 2) and math.sqrt(northdist*northdist+eastdist*eastdist) > canstep ):  
        previous_heading = math.degrees(math.atan2(eastdist, northdist)) 
        previous_pos[0] = pos[0] 
        previous_pos[1] = pos[1] 
 
    return previous_heading 
 
withCan.previous_pos = [0.0,0.0] 
withCan.previous_heading = 0.0 
withCan.previous_canflag = 0 
withCan.canstep = 0.2 
 
positions = backandforth([100,100]) #populates an array of form [x,y,canflag] 
 
for p in positions: 
    print withCan(p) 

我收到一条错误消息,显示 eastdist = pos[0]-previous_pos[0] NameError:未定义全局名称“previous_pos”。请问有人可以解释这个错误的原因吗?

请您参考如下方法:

当你这样做时:

def foo(): 
    pass 
 
foo.name = 1 

您没有创建全局名称 name。相反,您正在向 foo 函数添加一个属性!您可以通过以下方式访问它:

def foo(): 
    return foo.name 
 
foo.name = 1 

但这很奇怪。如果您需要一个全局名称,只需这样做:

def foo(): 
    global name 
    name += 1 
    return name 
 
name = 1 

请记住,如果您想从函数中修改全局名称,则必须将其声明为global。如果你不这样做,你可以使用它,但你不能分配给它。

您对静态名称的混淆可能来自使用类。但请注意,在您的代码中 withCan 不是一个类,它是一个普通函数!