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

标签 python list user-defined

我对Python完全陌生,所以请原谅这个糟糕的安排。

我正在尝试创建一个角色扮演游戏的开头,其中玩家选择要面对的怪物数量,然后为怪物命名。 该代码似乎接受数字输入,但是当它询问怪物的名称时,它返回 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()

是什么原因导致此错误以及如何尝试解决它?

最佳答案

您需要将怪物的数量发送到使用它的函数:

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)

使用列表乘法(使用星号运算符)创建可变对象列表是一个坏主意。因为您实际上在整个列表中使用相同的对象。如果对象是可变的 - 对象的更改会反射(reflect)在整个列表中。

我怀疑这对于初学者来说是一个微妙的问题,请阅读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 指定次数来创建怪物名称列表。

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

关于python - 如何在 Python 中创建用户定义的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382447/

相关文章:

c++ - 用户定义的转换运算符作为 printf 的参数

python - 如何将默认值数组添加到 ArrayField?

Python 多处理 : RuntimeError: "Queue objects should only be shared between processes through inheritance"

python - Networkx 作为任务队列?

Python向list添加多个列表

r - 在 R 中创建一个用户创建的函数

python - 在 Google Colab Research Notebook 中读取 shell 脚本结果

r - 包含特定列名的数据框子集列表

list - Sass - 找到列表的最大值

MySQL 在 where 子句中分配用户定义的变量