You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

  1. NameError:main函数调用draw_polygon时,传入的our_turtle和side_length未定义——main内仅创建了turtle实例jamie,没有声明our_turtle变量,也未给side_length赋值。
  2. UnboundLocalError:调整后仍未在main内正确定义our_turtle就直接引用,导致局部变量在赋值前被调用。
  3. 额外逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:25:24