Python调用draw_polygon函数遇NameError及变量作用域困惑求助
Python Turtle正多边形绘制问题及变量错误解决
问题背景
需实现功能:接收用户输入的整数,让名为jamie的turtle绘制对应边数的正多边形,要求自定义draw_polygon函数包含our_turtle、num_sides、side_length三个参数,但调用函数时出现NameError,调整后又出现UnboundLocalError,同时对Python局部/全局变量的逻辑存在困惑。
出错代码
def main(): import turtle jamie = turtle.Turtle() num_sides = int(input("please input positive integer that is 3 or greater: ")) draw_polygon(our_turtle, num_sides, side_length) def draw_polygon(our_turtle, num_sides, side_length): our_turtle = jamie.begin_poly() side_length = (num_sides - 2) * (180 / num_sides) for i in range(num_sides): jamie.left(side_length) return our_turtle main()
报错信息
首次报错
please input positive integer that is 3 or greater: 3 Traceback (most recent call last): File "D:\2022FALL_INTO_PROG\ValentinePA04.py", line 35, in <module> main() File "D:\2022FALL_INTO_PROG\ValentinePA04.py", line 12, in main draw_polygon(our_turtle, num_sides, side_length) NameError: name 'our_turtle' is not defined
调整后报错
Traceback (most recent call last): File "D:\2022FALL_INTO_PROG\ValentinePA04.py", line 34, in <module> main() File "D:\2022FALL_INTO_PROG\ValentinePA04.py", line 12, in main draw_polygon(our_turtle, num_sides, side_length) UnboundLocalError: local variable 'our_turtle' referenced before assignment
错误原因分析
- NameError:
main函数调用draw_polygon时,传入的our_turtle和side_length未定义——main内仅创建了turtle实例jamie,没有声明our_turtle变量,也未给side_length赋值。 - UnboundLocalError:调整后仍未在
main内正确定义our_turtle就直接引用,导致局部变量在赋值前被调用。 - 额外逻辑错误:
draw_polygon直接调用main内的局部变量jamie,函数无法访问外部函数的局部变量;计算的是正多边形内角,而绘制需要的是外角(每次转向360/num_sides度);缺少turtle前进的核心绘制代码。
修正后的代码
import turtle # 全局导入模块,更符合规范 def draw_polygon(our_turtle, num_sides, side_length): # 计算正多边形的外角,即每次转向的角度 turn_angle = 360 / num_sides for _ in range(num_sides): our_turtle.forward(side_length) our_turtle.left(turn_angle) def main(): jamie = turtle.Turtle() num_sides = int(input("请输入大于等于3的正整数: ")) side_length = 50 # 可固定长度,也可改为让用户输入 # 传入已定义的实例、边数、边长 draw_polygon(jamie, num_sides, side_length) turtle.done() # 保持绘图窗口不自动关闭 main()
局部/全局变量逻辑说明
- 局部变量:定义在函数内部的变量,仅能在函数范围内访问,比如
main里的jamie、num_sides,draw_polygon里的turn_angle。 - 全局变量:定义在所有函数外部的变量,整个代码均可访问,比如开头导入的
turtle模块。 - 函数参数属于局部变量的一种,调用时传入的实参会赋值给形参,比如
draw_polygon的our_turtle是形参,调用时传入jamie后,函数内就通过our_turtle操作该turtle实例。 - 若需在函数内修改全局变量,需添加
global声明,但不建议依赖全局变量,优先用参数传递和返回值实现函数间数据交互,避免全局变量污染。
内容的提问来源于stack exchange,提问作者valikazoo
相关产品推荐
相关产品推荐

