Python ';索引器:列表分配索引超出范围';在生成NPC时

Python ';索引器:列表分配索引超出范围';在生成NPC时,python,Python,我正在为NPC制作一个程序生成器,在让他们生孩子方面遇到了麻烦 我的生成创始人(那些出生日期任意而不是由怀孕算法驱动的创始人)的代码运行良好 #Make Founders for x in range (NumberOfFounders): y = str(x) z = 'Person' + y ListOfPeople.extend([z]) ListOfPeople[x] = Person(random.choice(ListOfNames), random.

我正在为NPC制作一个程序生成器,在让他们生孩子方面遇到了麻烦

我的生成创始人(那些出生日期任意而不是由怀孕算法驱动的创始人)的代码运行良好

#Make Founders
for x in range (NumberOfFounders):
    y = str(x)
    z = 'Person' + y
    ListOfPeople.extend([z])
    ListOfPeople[x] = Person(random.choice(ListOfNames), random.choice(ListOfNames), random.choice(ListOfNames), random.randint(1,10957), 'Null', 'Null', random.randint(0,1))
但当我尝试使用类似的代码生成子代时,我从

如果需要,我会发布更多的代码


谢谢。

给定
人员列表
在生成创始人后具有长度
k
,然后
q
被分配给
k+1

表达式
ListOfPeople.extend([s])
(可能应替换为
ListOfPeople.append
)将导致
ListOfPeople
具有长度
k+1


包含
k+1
元素的列表只能在0和
k
之间建立索引。您尝试使用
q
对其进行索引,这等于
k+1
,导致
索引器
被提升。

如果您在代码中添加一些
打印
,这是非常明显的

ListOfPeople
[Person\u 1,Person\u 2,Person\u 3]

q = len(ListOfPeople) + 1
# q = 4
r = str(q)
# r = '4'
s = 'Person' + r
# s = 'Person4'
ListOfPeople.extend([s])
# ListOfPeople = [Person_1, Person_2, Person_3, 'Person4']
ListOfPeople[q] = Person(random.choice(ListOfNames1), 'NameMother', 'NameFather',
# Index error because ListOfPeople[q] does not exist
你到底想达到什么目的?在下一个语句中,临时附加
'Person4'
,然后将最后一项替换为真实的
Person
实例

这似乎没有道理,但这可能是因为您简化了代码以解决问题

无论如何,如果我理解正确,您可以在一行中完成所有这些:

ListOfPeople.append(Person(random.choice(ListOfNames1), 'NameMother', 'NameFather',)
顺便说一句,这里有一些提示:

用数字格式化字符串。无需显式地“强制转换”为
str
。您可以直接使用
q

s = 'Person%s' % q
s = 'Person{}'.format(q)
访问列表的最后一个元素。无需获取长度或列表并计算最后一个元素的索引。使用负索引:

ListOfPeople[-1] = whatever...
添加到
列表中
。无需创建列表并调用extend。只需调用
append

ListOfPeople.append(s)

您是否试图将z(或s)附加到人员列表中,然后用Person()替换它?谢谢您的帮助。append优于extend有什么好处?@BrendanSleanbeck这是一种专门针对向数组末尾添加一个元素的常见用例而存在的方法。使用它可以让你的意图更加清晰,是首选的方法。我选择在阅读后使用extend。我的理解是append在列表中添加了一个列表(因此使用方括号),但是extend只是添加到列表中。不,
l.append(o)
只会将object
o
添加到列表的末尾
l
。只有当
o
本身是列表时,才会在列表中添加列表。
ListOfPeople.append(s)