NameError: глобальное имя «категория» не определено

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

Моя ошибка,

"NameError: глобальное имя "категория" не определено"

#Hangman Game V1 by (My name)

import random
import time

play_again = 'Yes'

#Categorys

animals = ['alligator', 'barracuda', 'cougar', 'cheetah', 'dolphin',      'falcon', 'gorilla', 'penguin', 'salmon', 'wombat']

olympics = ['archery', 'badminton', 'cycling', 'rowing', 'fencing', 'gymnastics', 'sailing', 'tennis', 'swimming',
            'volleyball']

countries = ['china', 'america', 'mexico', 'russia', 'sweden', 'canada', 'spain', 'korea', 'japan', 'france']


def intro():
    print ''
    print 'Welcome to Hangman by (My name)!'
    print ''
    print ''


def pick_category():
    category = raw_input('First, choose a category by typing in it\'s name. Your options are: Animals, Olympics, & '\
                         'Countries!')
    print ''
    print 'You chose the category ' + category + '.'
    return category

def choose_word():
    print ''
    print 'Now I will pick the secret word from your category.'
    print ''
    print '...'
    time.sleep(1)

    if category == 'Animals':
        secret_word = random.choice(animals)

    if category == 'Olympics':
        secret_word = random.choice(olympics)

    if category == 'Countries':
        secret_word = random.choice(countries)

    print ''
    print 'Alright, I have chosen the word!'
    #for testing purposes
    print secret_word

в то время как play_again: intro() pick_category() Choose_word()


person Samson_    schedule 02.08.2016    source источник
comment
Добро пожаловать в StackOverflow! Не нужно объяснять, что вы новичок или над чем вы уже работали. Просто объясните проблему под рукой, и, надеюсь, кто-то поможет вам. Кроме того, Python трудно форматировать. Пожалуйста, отредактируйте, если я что-то напутал.   -  person OneCricketeer    schedule 03.08.2016
comment
@cricket_007 Я полагаю, вы переформатировали мой первоначальный вопрос или сайт сделал это автоматически? В любом случае, я не могу точно сказать, вы вообще изменили код или просто переформатировали его?   -  person Samson_    schedule 03.08.2016
comment
Пробовал переформатировать, да. Я думаю, что цикл while в нижней части должен быть без отступа   -  person OneCricketeer    schedule 03.08.2016
comment
@cricket_007 О, понятно. Да, в моем реальном коде нет отступа. Я не уверен, что там произошло.   -  person Samson_    schedule 03.08.2016
comment
где эта функция category в функции choose_word?   -  person Raja Simon    schedule 03.08.2016


Ответы (1)


Вероятно, вы имели в виду, что category является аргументом choose_word(). В настоящий момент pick_category() возвращает значение локальной переменной category, которое затем игнорируется. Вместо этого определите choose_word() как:

def choose_word(category):
    ...

и передать ему возвращенную категорию, например так:

while play_again: 
    intro()
    # Passes the returned category as the argument
    choose_word(pick_category())
person Ilja Everilä    schedule 02.08.2016
comment
Судя по тому, как я интерпретировал то, что вы сказали, измениться. Вот что такое мой код. def Choose_word(pick_category): if category == 'Животные': secret_word = random.choice(животные) return secret_word if category == 'Olympics': secret_word = random.choice(olympics) return secret_word if category == 'Страны': secret_word = random.choice(countries) return secret_word print 'Хорошо, я выбрал слово!' в то время как play_again: intro() pick_category() Choose_word(pick_category()) - person Samson_; 03.08.2016
comment
Мне пришлось сократить его и вырезать текст, чтобы он поместился. Я действительно не знаю, что делаю, извините, формат этого комментария ужасен. По сути, я изменил def Choose_word() на def Choose_word(pick_category), затем в финальном коде внизу я изменил его на intro(), затем pick_category и, наконец, Choose_word(pick_category()) - person Samson_; 03.08.2016
comment
Вы назвали аргумент pick_category, но пытаетесь использовать переменную category, которая по-прежнему не определена. Назовите аргумент категория. - person Ilja Everilä; 03.08.2016
comment
Я изменил аргумент на просто категорию, и волнистые линии коррекции исчезли. Я протестировал код и вот что я вижу после интро. Сначала выберите категорию, введя ее название. Ваши варианты: Животные, Олимпийские игры и страны! Животные Вы выбрали категорию «Животные». Сначала выберите категорию, введя ее название. Ваши варианты: Животные, Олимпийские игры и страны! - person Samson_; 03.08.2016
comment
проблема в том, что он спрашивает дважды, когда это не должно быть проще - person Samson_; 03.08.2016
comment
Вы вызываете функцию дважды, игнорируя первый результат. - person Ilja Everilä; 03.08.2016
comment
Я удалил первую pick_category. Теперь я вижу, что select_word не продолжается. Похоже на это. Теперь я выберу секретное слово из вашей категории. ... - person Samson_; 03.08.2016
comment
Это выходит за рамки этого вопроса/ответа. Пожалуйста, задайте новый вопрос с правильным определением проблемы. См. как спросить. - person Ilja Everilä; 03.08.2016
comment
очень хорошо тогда. Я просто ищу, как заставить мой код работать, чтобы я мог перейти к следующим шагам. В любом случае спасибо за помощь - person Samson_; 03.08.2016
comment
Просто указатель: ваш выбор пишется с большой буквы. Ваш вклад? secret_word не будет определено, если введен неправильный ввод, и поэтому вы должны снова получить NameError, на этот раз для secret_word. - person Ilja Everilä; 03.08.2016