【问题标题】:How do I create a user-defined list in Python?如何在 Python 中创建用户定义的列表?
【发布时间】:2015-11-29 16:34:48
【问题描述】:

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

是什么导致了这个错误,我该如何尝试解决它?

【问题讨论】:

  • 我建议将怪物的数量 (number) 保存在程序内存中(例如,一个全局变量,一旦定义,脚本中的任何函数都可以访问它),这样你就不需要每次拨打monsters()时询问输入。

标签: python list user-defined


【解决方案1】:

你需要将怪物的数量发送给使用它的函数:

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

注意我也改了(在cmets提到之后):

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

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

【讨论】:

  • [[input('Monster name ')]] * number更改为[input('Monster name ') for i in range(number)]
  • 实际上字符串是不可变的,所以列表乘法可能在这里工作(但只在这里......),不是吗?
  • @ReutSharabani:啊,删除嵌套列表在这里会有所不同,是的。
  • 如果我错了,请纠正我,我会收到带有该行的TypeError
  • 好的。有问题。 OP 忘记输入 cast numberint(input('How many monsters will you face? '))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多