Необходимо использовать global для доступа к локальной переменной (без понятия почему) python;Киви
Вопрос
Недавно я скачал Kivy, так как он предоставил мне наиболее понятные руководства, документацию и т.д.Я пробовала pygame и cocos, но так и не смогла найти основу, а с Kivy это было легко.
Итак, вот моя проблема, я создал игру в настольный теннис, и я пытаюсь приостановить игру, остановив шарик для настольного тенниса, а затем запустив его снова, когда он не остановлен (изменив его скорость).
Вот мой код:
class PongGame(Widget):
...
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
if keycode[1] == 'escape':
#Why doesnt it work without global?
#If I don't use a global i get "tempBallVelocity referenced before assignment
global tempBallVelocity
tempBallVelocity = self.ball.velocity
self.ball.velocity = 0,0
if keycode[1] == '`':
#Make the ball go again, thus exiting pause
#This is where the error occurs if I don't use global
self.ball.velocity = tempBallVelocity
Как вы можете видеть в комментариях, если я не использую global, я получаю ссылку перед ошибкой присваивания.Но это локальная переменная, я не понимаю, почему это происходит.
У кого-нибудь есть какие-нибудь идеи?спасибо?
Редактировать:Просто чтобы убедиться, что всем ясны мои намерения, я не хочу использовать глобальный, но это единственный способ, которым это сработает.Я бы предпочел не использовать глобальные переменные.
Решение
Если вы снова исправите ошибку с отступом, вы увидите, что:
Вы можете видеть, что:
побег
escape
однако должен работать без глобальногоtempBallVelocity
будет рассматриваться как локальная переменная.Если вы хотите изменить глобальную переменную, вам нужно добавить глобальное объявление, чтобы сообщить python, чтоtempBallVelocity
является не локальным, а глобальным.Во втором случае,
tempBallVelocity
не инициализируется локально, если вы не вводите escape-блок, и, следовательно, не может использоваться как локальный Значение r.В этом случае python должен искать переменную вне класса.ЯвляетсяtempBallVelocity
действительно глобальная переменная?
замечание:если случаи являются исключительными, вам следует использовать elif
вместо if
для второго случая.
Другие советы
Ваш код внутри функции не имеет отступов, это просто ошибка копирования?Если нет, то я удивляюсь, почему вы не получаете сообщение об ошибке.
Редактировать:Хорошо, вы легко устанавливаете переменную tempBallVelocity
когда вы вызываете функцию с помощью 'escape'
но затем функция завершается, и вы теряете переменную.Если вы затем вызовете его с помощью 'backtick', вы не установили переменную tempBallVelocity
тем не менее, лучшим решением, вероятно, было бы:self.tempBallVelocity = self.ball.velocity
.
Каждый раз, когда вы устанавливаете переменную внутри идентифицированного блока кода, переменная разрушается после того, как вы получите из этого блока, обратно в предыдущую идентификацию;
Если вы пишете
if True:
foo = 'foo value, which is a string (?)'
print foo
.
Внутри огромного скрипта, Python обрабатывает только переменную Foo, в то время как это «внутри», если это утверждение, и как только он заканчивается, и выходит, Foo полностью забыта, чтобы сделать вещи быстрее, это понятно, что если вы установили вещи Переменная внутри оператора вы будете использовать его только внутри этого оператора.
Если вы хотите сделать что-то вроде этого
if True:
foo = 'foo value'
# Right now foo has been trashed
if True:
print foo
# Raises an error
.
Вам придется установить переменную Foo снаружи «если» операторы
foo = ''
if True:
foo = 'foo value'
# Right now foo still exists and keeps it's recently changed value
if True:
print foo
# prints 'foo value'
.
Или вы также можете сделать это, установив FOO в качестве глобальной переменной, чтобы она не была разрушена, как только вы попадаете за пределы «Если» оператор
if True:
global foo
foo = 'foo value'
# foo still exists as it's a global variable
if True:
print foo
# There's no reason so it wouldn't work
.
Но это может быть ненациональным и запутанным в большинстве циркулярных веществ, или даже проблематично, если вы начнете делать все глобальные, поэтому переменные, которые вы используете только после того, как только накапливаются только в памяти вашего устройства во время программы.
прямо сейчас вы пишете класс, поэтому правильный способ сделать то, что вы делаете (с моей точки зрения), чтобы хранить переменную «темперамент» в классе, подобное этому
class PongGame(Widget):
...
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
if keycode[1] == 'escape':
self.tempBallVelocity = self.ball.velocity
self.ball.velocity = 0,0
if keycode[1] == '`':
self.ball.velocity = self.tempBallVelocity
.
Похоже, это не уважает правило, которое я только что сказал вам, но вещь здесь - это то, что когда вы пишете «Self.tempballvervelacity= ...», вы храните в себе информацию, которая является ярлыком для Объект PONGGAME вы создаете создание того, чтобы запустить игру, которая запускает этот метод, поэтому переменные стенды, хранящиеся там, когда вы получаете метод.
Я надеюсь, что этот ответ вам полезен, вы должны получить более солидные знания о Python, Узнайте Python Трудный путь Это сайт книги с бесплатной HTML-версией, которая была полезна для меня.