我正在编写游戏并使用乌龟来导入图像,因为这是我所知道的唯一方法,但是当我尝试在其原始功能之外定义乌龟(以便可以使用它)时遇到了一个问题在其他位置),它会创建另一个具有相同名称的乌龟,而不是让第一个乌龟实际执行“ goto”行。这是我的代码中出现的问题的示例。 (这不是我的实际代码,但是,问题是相同的,不受其他代码的影响:)
import turtle
def example():
a = turtle.Turtle()
example()
a.goto(100,0)
这得到NameError: name 'a' is not defined
。然后,当我尝试定义a
时,就像这样:
example()
a = turtle.Turtle()
a.goto(100,0)
输出是两只乌龟,其中只有一只执行goto()
命令。
感谢您抽出宝贵的时间阅读我的文章,我是编码的新手,这让我很困扰!
答案 0 :(得分:2)
发生这种情况是因为函数内部的变量绑定到函数范围。基本上,如果您在函数a
中定义变量example()
,则该变量仅存在于该函数中,并且在函数调用结束时将消失。
例如,如果您尝试运行以下命令:
def foo():
bar = 2
foo()
print bar
输出
> NameError: name 'bar' is not defined
发生这种情况是因为bar
仅居住在foo
内部。但是,您可以使用global
语句将bar
绑定到全局范围。
def foo():
global bar
bar = 2
foo()
print bar
输出:
> 2
但这不是一个很好的做法。相反,在您的情况下,您可以在调用example
时返回对象,从而获取您创建的对象。
import turtle
def example():
a = turtle.Turtle()
return a
a = example()
a.goto(100,0)
答案 1 :(得分:1)
我认为你很亲近。我要做的一件事是确保python函数example()
返回一个对象。现在,它什么也不返回。另外,请确保将函数返回的值分配给变量。我会尝试:
import turtle
def example():
a_turtle = turtle.Turtle()
return a_turtle
a = example()
a.goto(100,0)
b = example()
b.goto(50,0)
我对乌龟程序包不太了解,所以我不确定是否有办法让多个乌龟通过一个命令来响应,但是上面的代码对我有用,因此可以得到两只乌龟,{{1 }}和a
进行移动。
Edit :此外,就像其他答案一样,请仔细阅读名称空间和函数。有助于弄清哪里可以访问哪些内容。
答案 2 :(得分:0)
我读写大量的Python乌龟代码,并且看到这种情况的最常见方法是:
import turtle
def example():
a.dot() # do something with the turtle
a = turtle.Turtle()
example()
a.goto(100, 0)
或者,就像往常一样:
import turtle
def example(t):
t.dot() # do something with the turtle
a = turtle.Turtle()
example(a)
a.goto(100, 0)
这些方法还反映出,乌龟的行为总是像 global 实体(它们在乌龟库中的列表上注册,因此从不进行垃圾回收。)在函数内部创建一个,而不返回它,不会使其成为函数的 local ,只是指向该函数的指针是local。此后,乌龟仍然几乎无法访问。