我写了一个函数来计算两点之间的航向,只有当车辆报告它正在移动并且车辆在两点之间移动了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.有人可以解释这个错误的原因吗?
当你这样做:
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中不是一个类,它是一个简单的函数!
| 归档时间: |
|
| 查看次数: |
1207 次 |
| 最近记录: |