Python - проблема с переменными - PullRequest
0 голосов
/ 16 августа 2011

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

Вот пример, который я быстро сделал, чтобы продемонстрировать свою проблему:

life = 200

def example(dudeHP):
    dudeHP = dudeHP - 75
    print (dudeHP)

example(life)
print (life) #output is 200, but I want it to be 125

Как вы можете видеть, я пытаюсь получить значение глобальной переменной «life» для изменения внутри кодового блока def с помощью dudeHP (который будет локальной переменной, если я не ошибаюсь?)

Этожизнеспособна?Есть ли лучший способ сделать это?Или я все делаю не так?Заранее благодарю:)

Ответы [ 5 ]

3 голосов
/ 16 августа 2011

Ну, во-первых, вы, вероятно, захотите написать класс или что-то, чтобы организовать все это в какой-то момент. Изменение глобальных переменных внутри функций или методов обычно считается плохой идеей.

То, что вы можете попробовать, это:

life = 200

def example(x):
    return x - 75

life = example(life)

Конечно, в этом случае операция вычитания настолько тривиальна, что вам не нужно инкапсулировать ее в функцию.

1 голос
/ 16 августа 2011

В дополнение к подсказкам и предложениям Неда Батчелдерса и Кристоффа об использовании класса, вы можете сделать это следующим образом:

class Dude:
    def __init__(self, hp=200):
        self.hp = hp

    def eat(self):
        self.hp = self.hp + 25

def example(dude):
    dude.hp -= 75

hero = Dude()
example(hero)
hero.eat()
print(hero.hp)   # 150

Если у вас нет веской причины, почему example должен быть стандартомОдна функция, вы должны сделать ее методом Dude, таким как eat, поскольку example явно действует и в некотором смысле принадлежит объекту класса Dude.

1 голос
/ 16 августа 2011

Кстати, вопрос не относится к Python3, если только новичок не озадачен названием. Это общий вопрос языка Python.

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

Лучший способ справиться с этим - вернуть значение из функции, как указано в другом ответе.

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

a = 200

def example(b):
    global a
    a = a - 25

example(a)
print a

Но это не одобряется и не очень хороший стиль. Есть еще один трюк, который вы используете, но он выходит за рамки начального уровня и выглядит следующим образом. а = [200]

def example(a):
    a[0] = a[0] - 25

example(a)
print a[0]

Вы можете легко совершать ошибки Если вы примете этот путь,

Но правильный путь для этого по-прежнему:

a = 200

def example(b):
    return b - 25

print example(a)
0 голосов
/ 17 июля 2017

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

0 голосов
/ 16 августа 2011

В вашей функции имя dudeHP является локальным для функции.Когда вы изменяете его, вы изменяете только локальное имя, вы не можете влиять на значение передаваемого имени.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...