2015-09-03 4 views
2

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

Я пытаюсь создать начало RPG, в котором игрок выбирает количество монстров, чтобы посмотреть в лицо, а затем называет монстров. код, кажется, принимает ввод номера, но когда он запрашивает имена монстра он возвращает NameError: name 'number' is not defined.

def welcome():  
    number = monsters() 
    print('Alright, ' + str(number) + ' monsters.') 
    print('So, what are the names of these beasties?') 
    mNames = monsterNames() 

def monsters(): 
    number = input('How many monsters will you face? ') 
    return number 

def monsterNames(): 
    totalMobs = [[input('Monster name ')]] * number 
    return totalMobs 

def main(): 
    welcome() 

main() 

Что вызывает эту ошибку и как я могу попытаться решить ее?

+0

Я бы рекомендовал сохранить количество монстров ('number') в памяти программ (например, глобальную переменную, доступную любой функцией в скрипте после ее определения), так что вам не нужно запрашивать входные данные каждый время, которое вы вызываете 'monsters()'. –

ответ

2

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

def welcome(): 
    number = monsters() 
    print('Alright, ' + str(number) + ' monsters.') 
    print('So, what are the names of these beasties?') 
    # send number of monsters to 'monsterNames' 
    mNames = monsterNames(number) 

И:

# accept number rof monsters as an argument from 'welcome' 
def monsterNames(number): 
    totalMobs = [input('Monster name ')] * number 
    return totalMobs 

Вы также должны бросить number на целое число, как указано @BhargavRao:

def monsters(): 
    number = input('How many monsters will you face? ') 
    return int(number) # this can fail, use try-catch optimally 

Обратите внимание, что я также изменил (после комментариев упоминали):

[[input('Monster name ')]] * number # creates nested lists (mutable) 

To:

[input('Monster name ')] * number # creates list of strings (immutable) 

Создание списка изменяемых объектов списка умножения (с помощью оператора звезда) является плохой идеей. Потому что вы фактически используете один и тот же объект во всем списке. Если объект изменен - ​​изменение объекта отражается во всем списке.

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

Теперь, когда это не важно, важно отметить, что то, что вы делаете, дублирует одно и то же имя по всему списку. Что вам хочу, чтобы сделать, это создать новое имя для каждого монстра - так что вы должны использовать понимание списка, которое требует ввода несколько раз. Новый и улучшенный monsterNames функция выглядит следующим образом:

# accept number rof monsters as an argument from 'welcome' 
def monsterNames(number): 
    totalMobs = [input('Monster name ') for _ in range(number)] 
    return totalMobs 

Это создаст список имен монстров, вызвав input заданное число раз.

Кроме того, выбор _ в качестве имени переменной означает, что он фактически не используется нигде.

+2

Измените '[[input ('Monster name')]] * number' to' [input ('Monster name') для i в диапазоне (число)] ' –

+0

Фактически строки неизменяемы, поэтому здесь может работать умножение списка (но только здесь ...), не так ли? –

+1

@ReutSharabani: ах, удаление вложенного списка имеет значение здесь, да. –

Смежные вопросы