如何在Python中创建用户定义的列表?

时间:2015-09-03 17:57:12

标签: python list user-defined

我是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()

导致此错误的原因是什么,我该如何解决?

1 个答案:

答案 0 :(得分: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)

要:

[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指定的次数来创建怪物名称列表。

此外,选择_作为变量名称已经意味着它实际上并未在任何地方使用。