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

Jam*_*mes 1 python

我写了一个函数来计算两点之间的航向,只有当车辆报告它正在移动并且车辆在两点之间移动了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)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说eastdist = pos[0]-previous_pos[0] NameError: global name 'previous_pos' is not defined.有人可以解释这个错误的原因吗?

rod*_*igo 6

当你这样做:

def foo():
    pass

foo.name = 1
Run Code Online (Sandbox Code Playgroud)

您没有创建全局名称name.相反,您正在为该foo函数添加属性!你可以用以下方式访问它:

def foo():
    return foo.name

foo.name = 1
Run Code Online (Sandbox Code Playgroud)

但这很奇怪.如果您需要全局名称,请执行以下操作:

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

name = 1
Run Code Online (Sandbox Code Playgroud)

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

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