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






Это происходит потому, что переменные внутри функции привязаны к области видимости функции. По сути, если вы определяете переменную 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)
Спасибо за помощь, все заработало! Я уже исправлял это раньше, и это сводило меня с ума, я обязательно буду использовать это снова в будущем. Я также хотел бы сказать, что это сработало для одной из моих переменных, но не для другой (должно быть, это была ошибка в другом месте), поэтому я принял ваш совет и определил их вне функции, и это работает.
Рад слышать, что @OliverPickford сработало. Вы всегда можете объявить переменные внутри функций и вернуть их в конце функции, чтобы продолжить ее жизненный цикл вне функции. В этой ветке есть несколько ответов, поэтому, пожалуйста, пометьте ответ, который, по вашему мнению, помог вам больше всего, как принятый, чтобы завершить свой вопрос.
Я думаю, вы очень близки. Единственное, что я хотел бы сделать, это убедиться, что ваша функция 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)
Я не слишком хорошо знаю пакет turtle, поэтому я не уверен, есть ли способ заставить несколько черепах отвечать одной командой, но приведенный выше код работает для меня, чтобы заставить двух черепах, a и b, двигаться.
Редактировать: Также, как говорят другие ответы, почитайте немного о пространствах имен и функциях. Это поможет понять, что и где доступно.
Спасибо, ценю ваш быстрый ответ и помощь! Я также обязательно прочитаю о них.
Я читаю и пишу много кода черепахи на 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 aв своем примере функции.