如何在Python中定义乌龟而不创建新乌龟?

时间:2018-11-06 22:10:14

标签: python variables undefined turtle-graphics

我正在编写游戏并使用乌龟来导入图像,因为这是我所知道的唯一方法,但是当我尝试在其原始功能之外定义乌龟(以便可以使用它)时遇到了一个问题在其他位置),它会创建另一个具有相同名称的乌龟,而不是让第一个乌龟实际执行“ 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()命令。

感谢您抽出宝贵的时间阅读我的文章,我是编码的新手,这让我很困扰!

3 个答案:

答案 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。此后,乌龟仍然几乎无法访问。