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

为什么Python运行代码时提示变量wn未定义?

问题根因及修复方案

1. 变量作用域问题(wn未定义的直接原因)

所有在函数内部创建的变量默认是函数私有的局部变量,仅在函数内部生效,外部和其他函数无法访问:

  • setupWindow函数里创建的wn没有返回给外部,main函数无法获取这个变量
  • setupTurtles函数里创建的michelangelo、leonardo也是局部变量,main函数调用赛跑相关函数时同样会提示未定义

2. 其他隐含错误

  • raceTwo调用时乌龟名称拼写错误:michelangelo少写了末尾的o,写成了michelangel
  • drawShapes函数写死了使用leonardo,传入的myturtle参数完全失效
  • 全局作用域提前调用了一次setupTurtles(),创建的乌龟对象是局部变量,没有实际作用

修正后可正常运行的代码

import turtle
import random

#Part A
def setupWindow():
    wn = turtle.Screen()
    wn.bgcolor('lightblue')
    # 返回创建好的窗口对象给外部使用
    return wn

def setupTurtles():
    michelangelo = turtle.Turtle()
    leonardo = turtle.Turtle()
    michelangelo.color('orange')
    leonardo.color('blue')
    michelangelo.shape('turtle')
    leonardo.shape('turtle')
    michelangelo.up()
    leonardo.up()
    michelangelo.goto(-100,20)
    leonardo.goto(-100,-20)
    michelangelo.speed(1)
    leonardo.speed(1)
    # 返回两个乌龟对象给外部使用
    return michelangelo, leonardo

#Race 1
def raceOne(myturtle, myturtle2):
    myturtle.forward(random.randrange(1,101))
    myturtle2.forward(random.randrange(1,101))

#Race 2
def raceTwo(myturtle, myturtle2):
    for x in range(10):
        myturtle.forward(random.randrange(0,11))
        myturtle2.forward(random.randrange(0,11))

# Part B
def drawShapes(myturtle):
    myturtle.down()
    for sides in [3, 4, 6, 9, 12]:
        for i in range(sides):
            # 改用传入的myturtle参数,不写死固定乌龟
            myturtle.forward(50)
            myturtle.right(360/sides)
        myturtle.clear()
    return sides


def main():
    # 接收各个函数返回的对象,即可在main中正常调用
    wn = setupWindow()
    michelangelo, leonardo = setupTurtles()
    raceOne(michelangelo, leonardo)
    # 修正拼写错误
    raceTwo(michelangelo, leonardo)
    drawShapes(leonardo)
    wn.exitonclick()

main()

内容的提问来源于stack exchange,提问作者brisaniashley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:15:06