Nano Hash - криптовалюты, майнинг, программирование

Глобальная переменная области видимости не меняется в python

В этом коде

money = .3

Things = ["Nothing"]

def main():
    print "go to buy things"
    print "Current Money %s" % (money)
    print "Things you have:"
    for item in Things:
        print item
    wait = raw_input()
    buythings(money)


def buythings(money):
    print "Type Buy to buy things"
    buy = raw_input()
    if buy == "buy":
        money = money - .3
        Things.append("Things")
        main()
    else:
        print "you bought nothing"
        print ""
        main()

Почему после покупки вещей деньги не уходят? Это было проблемой для меня какое-то время, и я не могу понять, как прицел работает в этой ситуации.

23.02.2015

Ответы:


1

Глобальная переменная money затенена параметром функции money в функции buythings(money). Вы должны удалить параметр, чтобы он работал:

def main():
    global money
    global Things
    ...

def buythings():
    global money
    global Things
    ...

Однако лучший подход, как указал alfasin, будет передавать money и Things в качестве параметров для обеих функций и не использовать global вообще ключевое слово:

def main(money, things):
    ...
    for item in things:
        print item
    wait = raw_input()
    buythings(money, things)


def buythings(money, things):
    ...
    if buy == "buy":
        money = money - .3
        Things.append("Things")
        main(money, things)
    else:
        ...
        main(money, things)

>>> money = .3
>>> Things = ["Nothing"]
>>> main(money, Things)

Надеюсь это поможет.

23.02.2015
  • Правильно, но этого недостаточно, либо main() должен объявить money также глобальным (но ведь глобалы - это зло, верно?), либо, что еще лучше, buythings() должен вернуть обновленную переменную money в main() 23.02.2015

  • 2

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

    money = 0
    
    def set_money_to_one():
        global money    # Needed to modify global copy of money
        money = 1
    
    def print_money():
        print money     # No need for global declaration to read value of money
    
    set_money_to_one()
    print_money()       # Prints 1
    

    В твоем случае :

    def buythings():
        global money
    

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

    23.02.2015
    Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..