Python - Как бы вы сделали переменные в этом блоке глобальными? - PullRequest
1 голос
/ 30 декабря 2011

[Python] Мне нужно сделать первые 3 переменные (атака, точки попадания, деньги) глобальными, но я не знаю как, потому что они случайные (random.randint). Может кто-нибудь сказать мне, какой код должен быть? Спасибо!

Редактировать: Моя ошибка похожа на "локальную переменную" деньги ", на которую ссылаются до назначения" позже в скрипте.

Вот ссылка на полный скрипт: http://dl.dropbox.com/u/55052881/fightprogram.txt

Извините, если это действительно небрежно, я только начал изучать python неделю назад.

while roll == 1:

    attack = random.randint(1, 100)
    hitpoints = random.randint(1, 500)   
    money = random.randint(1, 1000)

    attackstr = str(attack)              
    hitpointsstr = str(hitpoints)
    moneystr = str(money)

    print()
    print('Your attack level is ' + attackstr + '.')
    print('You have ' + hitpointsstr + ' hitpoints.')
    print('Your have ' + moneystr + ' coins.')

    print()
    print('Type 1 to reroll.')
    print('Type 2 to proceed.')
    reroll = input()
    reroll = int(reroll)
    if reroll == 2:
        break

Ответы [ 4 ]

2 голосов
/ 30 декабря 2011

Я полагаю, код, который вы разместили, находится внутри функции?Если да, вы должны вернуть значения вместо глобальных: return attack, hitpoints, money возвращает кортеж с этими тремя значениями.

В противном случае вы можете записать в переменнуюв глобальной области видимости, определяя его внутри функции с помощью оператора global:

global attack, hitpoints, money

Кстати, чтение работает без global, как и изменение изменяемого объекта.

1 голос
/ 30 декабря 2011

Я думаю, вы неправильно понимаете, что значит переменная быть глобальной.Я настоятельно рекомендую прочитать документацию Python по областям и пространствам имен , но я сделаю все возможное, чтобы подвести итог так, чтобы это соответствовало вашей проблеме.

"Глобальная переменная" - это переменнаяэто находится в глобальном пространстве имен.Для каждого модуля есть отдельное глобальное пространство имен.Помимо модулей, классы и функции - единственные вещи, которые будут создавать новые области.Любые новые переменные, которые вы создаете, будут помещены в самую внутреннюю область.

Существует глобальное ключевое слово , которое можно использовать для ссылки на глобальные переменные, но это необходимо только при назначении дляглобальная переменная, например:

x = 5
def foo():
    x = 10
def bar():
    global x
    x = 20

>>> x      # global variable x
5
>>> foo()  # foo creates a new x in the local scope
>>> x      # global x is unchanged
5
>>> bar()  # bar uses global keyword to reference the global x
>>> x      # global x is now 20
20

В вашем изолированном примере кода attack, hitpoints и money уже являются глобальными переменными, поскольку они не входят ни в какую другую область, и они будутбыть изменены в каждом цикле цикла.Если ваш код фактически находится в классе или функции, то добавление строки global attack, hitpoints, money в начало этой области приведет к тому, что эти переменные будут установлены в глобальном пространстве имен для вашего модуля.

1 голос
/ 30 декабря 2011

Инициализируйте их начальным значением где-нибудь с глобальной областью действия.

0 голосов
/ 15 марта 2012

Кстати, вам не нужно attackstr = str(attack)

В Python встроено расширение строк, например: print('Your attack level is %s.' % attack)

...