Python使用turtle库传入自定义命名实例报未定义错误解决方法
问题核心原因
- 第一段可运行代码中,
tut = Turtle()是全局作用域下定义的变量,square函数执行时如果在自身内部找不到tut变量,会自动去全局作用域查找,所以能正常运行 - 第二段代码里,
tut是定义在big函数内部的局部变量,仅在big函数内部生效,全局作用域没有tut变量,square函数自身也没定义tut,因此会抛出未定义的报错 - 你的原始写法本身存在逻辑问题:
square定义时接收了名为turtle的参数,但全程没有用到这个参数,硬编码依赖外部的tut变量,属于不合理的写法
修复方案
你完全可以自由给turtle实例起自定义名字,优先推荐以下方案,既可以灵活命名实例,又能保证函数的复用性:
from turtle import * # 函数参数名可以自定义,比如这里定为t def square(t): # 函数内直接使用传入的参数即可,不需要硬写外部的变量名 t.forward(100) t.right(90) def big(): space = Screen() # 实例的名字你可以随便定义,比如叫my_turtle、tut、a都可以 my_custom_turtle = Turtle() # 把你命名好的实例作为参数传入square函数即可正常运行 square(my_custom_turtle) big()
如果你非要在函数内直接使用你自定义的实例名(非常不推荐,会大幅降低函数复用性、提升维护成本),可以把实例声明为全局变量:
from turtle import * def square(): tut.forward(100) tut.right(90) def big(): global tut # 声明tut是全局变量,全局作用域可访问 space = Screen() tut = Turtle() square() big()
注意:第二种方案仅做原理演示,实际开发中禁止使用,这种写法会让函数依赖不明确,只能固定操作名为tut的实例,无法同时创建多个turtle实例分别绘制。
内容的提问来源于stack exchange,提问作者pythonnoooob
相关产品推荐
相关产品推荐

