Как определить черепаху в Python, не создавая новую? - PullRequest
0 голосов
/ 07 ноября 2018

Я кодирую игру и использую черепах для импорта изображений, так как это единственный известный мне способ, но у меня возникла проблема, когда я пытаюсь определить свою черепаху вне ее первоначальной функции (чтобы я мог ее использовать в другом месте), он создает другую черепаху с тем же именем, а не заставляет первую черепаху фактически выполнять линию «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 голосов
/ 07 ноября 2018

Я думаю, что вы очень близки. Единственное, что я хотел бы сделать, это убедиться, что ваша функция 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)

Я не очень хорошо знаю пакет с черепахой, поэтому я не уверен, есть ли способ заставить несколько черепах отвечать одной командой, но приведенный выше код работает для меня, чтобы получить двух черепах, a и b для перемещения.

Редактировать : Также, как и в других ответах, прочитайте немного о пространствах имен и функциях. Это поможет прояснить, что доступно где.

0 голосов
/ 07 ноября 2018

Я читаю и пишу много кода 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)

Эти подходы также отражают, что черепахи всегда ведут себя как глобальные сущности (они зарегистрированы в списке внутри библиотеки черепах, поэтому никогда не удаляются сборщиком мусора.) Создавая одну внутри функции, а не возвращая ее, не делает его локальным для функции - просто указатель на него является локальным. Черепаха продолжает существовать , почти недоступная впоследствии.

0 голосов
/ 07 ноября 2018

Это происходит потому, что переменные внутри функции связаны с областью действия функции. По сути, если вы определите переменную 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)
...