如何创建特定类型对象的列表但是为空?可能吗?我想创建一个对象数组(该类型称为Ghosts),后来将包含从名为Ghosts的一个类继承的不同类型。它在C ++中非常简单,但我不确定如何在python中这样做。我试过这样的事情:
self.arrayOfGhosts = [[Ghost() for x in xrange(100)] for x in xrange(100)]
但它已经被对象初始化了,我不需要它,有没有办法将它初始化为0但是有一个Ghost类型的列表?
如你所见,我对python很陌生。任何帮助将受到高度赞赏。
答案 0 :(得分:4)
这些是列表,而不是数组。 Python是一种鸭式语言。无论如何,列表是异质类型的。例如。您的列表可以包含int
,后跟str
,然后是list
,或者您喜欢的任何内容。您不能使用库存类限制类型,而且这种类型与语言的哲学相悖。
只需创建一个空列表,然后再添加。
self.arrayOfGhosts = []
二维列表很简单。只是嵌套列表。
l = [[1, 2, 3], [4, 5, 6]]
l[0] # [1, 2, 3]
l[1][2] # 6
如果您真的想要占位符,只需执行以下操作即可。
[[None] * 100 for i in range(100)]
Python没有数组,除非你的意思是array.array
,无论如何都是C-ish类型。在大多数情况下,数组是Python中错误的抽象级别。
P.S。如果您正在使用xrange
,则必须使用Python 2.除非您需要非常具体的库,否则请停止并使用Python 3. See why。
P.P.S。您使用NULL
进行初始化,而不是使用C ++中的0
进行初始化。切勿使用0
来表示NULL
。
P.P.P.S。请参阅PEP 8,规范的Python样式指南。
答案 1 :(得分:3)
Python是一种动态语言,因此没有array of type
的概念
您可以使用以下命令创建一个空通用列表:
self.arrayOfGhosts = []
您不关心列表的容量,因为它也是动态分配的
您可以根据需要填充尽可能多的Ghost
个实例:
self.arrayOfGhosts.append(Ghost())
上述情况确实足够了:
如果您确实要强制执行此列表以仅接受Ghost
并继承类实例,则可以创建如下自定义列表类型:
class GhostList(list):
def __init__(self, iterable=None):
"""Override initializer which can accept iterable"""
super(GhostList, self).__init__()
if iterable:
for item in iterable:
self.append(item)
def append(self, item):
if isinstance(item, Ghost):
super(GhostList, self).append(item)
else:
raise ValueError('Ghosts allowed only')
def insert(self, index, item):
if isinstance(item, Ghost):
super(GhostList, self).insert(index, item)
else:
raise ValueError('Ghosts allowed only')
def __add__(self, item):
if isinstance(item, Ghost):
super(GhostList, self).__add__(item)
else:
raise ValueError('Ghosts allowed only')
def __iadd__(self, item):
if isinstance(item, Ghost):
super(GhostList, self).__iadd__(item)
else:
raise ValueError('Ghosts allowed only')
然后,对于二维列表,您可以使用此类,如:
self.arrayOfGhosts = []
self.arrayOfGhosts.append(GhostList())
self.arrayOfGhosts[0].append(Ghost())
答案 2 :(得分:1)
Python中的列表可以根据需要增长,它们的长度不像C或C ++中那样固定。
因此,无需在Python中“初始化”列表。只需在需要时创建它,然后根据需要添加它。
您绝对不需要Ghost对象的“归零列表”,只需执行以下操作:
scary_farm = [] # This is an empty list.
ghosts = []
# .. much later down in your code
mean_ghost = Ghost(scary_level=10, voice='Booooo!')
ghosts.append(mean_ghost)
casper = Ghost(scary_level=-1, voice="I'm the friendly ghost. Hee hee!")
ghosts.append(casper)
# ... later on
scary_farm.append(ghosts) # Now you have your 2-D list
for item in scary_farm:
for ghost in item:
print('{0.voice}'.format(ghost))
请注意,在Python中单步执行列表或任何集合时,也不需要索引列表。在C / C ++中,您可能习惯于:
for(i = 0; i < 10; i++)
{
cout << scary_farm[i] << endl;
}
但这在Python中不是必需的,因为集合类型可以直接迭代。