Вопрос по python – Несвязанная локальная ошибка с глобальной переменной

7

Я пытаюсь выяснить, почему я получаю UnboundLocalError в моем приложении Pygame, Table Wars. Вот краткое изложение того, что происходит:

Переменные,REDGOLD, REDCOMMAND, BLUEGOLD а такжеBLUECOMMAND, инициализируются как глобальные переменные:

#Red Stat Section
REDGOLD = 50
REDCOMMAND = 100
#Blue Stat Section
BLUEGOLD = 50
BLUECOMMAND = 100

def main():    

    [...]

    global REDGOLD
    global REDCOMMAND
    global BLUEGOLD
    global BLUECOMMAND

Это работает при порождении юнитов в основном цикле, вычитая средства для порождения юнитов.

Прямо сейчас я пытаюсь настроить систему так, чтобы, когда юнит умирает, убийца возвращал жертве деньги.COMMAND и зарабатываетGOLD на основании чего он убил

class Red_Infantry(pygame.sprite.Sprite):
def __init__(self, screen):
    [...]
    self.reward = 15
    self.cmdback = 5

[...]

def attack(self):
    if self.target is None: return
    if self.target.health <= 0:
        REDGOLD += self.target.reward          #These are the problem lines
        BLUECOMMAND += self.target.cmdback     #They will cause the UnboundLocalError
                                               #when performed
        self.target = None
    if not self.cooldown_ready(): return
    self.target.health -= self.attack_damage
    print "Target's health: %d" % self.target.health

Это работает до тех пор, пока юнит не умрет. Тогда это происходит:

Traceback (most recent call last):
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 606, in <module>
main()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 123, in main
RedTeam.update()
File "C:\Python27\lib\site-packages\pygame\sprite.py", line 399, in update
for s in self.sprites(): s.update(*args)
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 304, in update
self.attack()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 320, in attack
REDGOLD += self.target.reward
UnboundLocalError: local variable 'REDGOLD' referenced before assignment

Как я могу получить глобальные переменные, упомянутые выше, чтобы изменить сattack блок? Если это помогает, я использую Pygame 2.7.x, поэтомуnonlocal не будет работать: /

Ваш Ответ

3   ответа
9

global сделать глобальную переменную видимой в текущем блоке кода. Вы только положитеglobal утверждение вmain, не вattack.

ADDENDUM

Вот иллюстрация того, что нужно использовать глобальный более одного раза. Попробуй это

RED=1

def main():
    global RED
    RED += 1
    print RED
    f()

def f():
    #global RED
    RED += 1
    print RED

main()

Вы получите ошибкуUnboundLocalError: local variable 'RED' referenced before assignment.

Теперь раскомментируйте глобальное утверждение в f, и оно будет работать.

Theglobal объявление активно в ЛЕКСИЧЕСКОМ, а не ДИНАМИЧЕСКОМ объеме.

Именно это я и сделал. Глобальные переменные вызываются в главном цикле сразу послеmain()ункция @ устанавливает экран и инициализирует часы Oventoaster
Это прекрасно работает. Спасибо Oventoaster
3

и, где они изменяются

Лучше пока найди способ не использовать глобалы. Имеет ли смысл, например, атрибуты класса?

2

main действуют как глобальные переменные «только для чтения» в функции. Если мы попытаемся переназначить значение, это приведет к ошибке.

Пытаться

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]

f()

Все нормально

Но

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]
    A = [1,1,1,1,1]

f()

Сформировать

  File "./test.py", line 6, in f
    print A[RED]
UnboundLocalError: local variable **'A'** referenced before assignment

а также

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]
    RED = 2

f()

Сформировать

  File "./test.py", line 6, in f
    print A[RED]
UnboundLocalError: local variable **'RED'** referenced before assignment

Похожие вопросы