Необходимо использовать global для доступа к локальной переменной (без понятия почему) python;Киви

StackOverflow https://stackoverflow.com//questions/11700648

  •  13-12-2019
  •  | 
  •  

Вопрос

Недавно я скачал 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, я получаю ссылку перед ошибкой присваивания.Но это локальная переменная, я не понимаю, почему это происходит.

У кого-нибудь есть какие-нибудь идеи?спасибо?

Редактировать:Просто чтобы убедиться, что всем ясны мои намерения, я не хочу использовать глобальный, но это единственный способ, которым это сработает.Я бы предпочел не использовать глобальные переменные.

Это было полезно?

Решение

Если вы снова исправите ошибку с отступом, вы увидите, что: Вы можете видеть, что:

  1. побег escape однако должен работать без глобального tempBallVelocity будет рассматриваться как локальная переменная.Если вы хотите изменить глобальную переменную, вам нужно добавить глобальное объявление, чтобы сообщить python, что tempBallVelocity является не локальным, а глобальным.

  2. Во втором случае, 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-версией, которая была полезна для меня.

Увидимся! : D

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top