Как определить черепаху в Python без создания новой?

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

Спасибо, что нашли время прочитать мой пост, я новичок в программировании, и это меня беспокоит!

Переменные, назначенные в функции, являются локальными по отношению к функции. Они перестают существовать, когда функция завершается, и не имеют ничего общего с одноименными переменными вне функции. Если вы не используете оператор global a в своем примере функции.

progmatico 06.11.2018 23:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
866
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Oliver Pickford 07.11.2018 20:49

Рад слышать, что @OliverPickford сработало. Вы всегда можете объявить переменные внутри функций и вернуть их в конце функции, чтобы продолжить ее жизненный цикл вне функции. В этой ветке есть несколько ответов, поэтому, пожалуйста, пометьте ответ, который, по вашему мнению, помог вам больше всего, как принятый, чтобы завершить свой вопрос.

Johan 07.11.2018 21:10

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

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

Спасибо, ценю ваш быстрый ответ и помощь! Я также обязательно прочитаю о них.

Oliver Pickford 07.11.2018 20:50

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

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

Спасибо, у меня недавно были проблемы с локальными / глобальными переменными, и ваш совет мне помог.

Oliver Pickford 07.11.2018 20:51

Другие вопросы по теме