如何创建一个特定类型的空列表
我想知道怎么创建一个特定类型的空对象列表,这可能吗?我想创建一个对象数组(这个类型叫做“Ghosts”),以后会包含不同类型的对象,这些对象都是从这个“Ghosts”类继承来的。在C++里这很简单,但我不太确定在Python里怎么做。我试过类似这样的代码:
self.arrayOfGhosts = [[Ghost() for x in xrange(100)] for x in xrange(100)]
但是这个列表已经被对象初始化了,而我并不需要这样,有没有办法让它初始化为0,但仍然保持类型为“Ghost”的列表呢?
如你所见,我对Python还很陌生。任何帮助都会非常感激。
5 个回答
在Python 3.9版本之后,from typing import List
这个写法已经不推荐使用了。
现在你不需要再单独导入什么东西了,可以直接使用list这个词。
举个例子:
my_list: list[float] = list()
这行代码的意思是创建一个可以存放浮点数的空列表。
在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中,这并不是必须的,因为集合类型可以直接进行遍历。
从Python 3.5开始,你可以这样做:
https://docs.python.org/3/library/typing.html
self.arrayOfGhosts: list[Ghost] = []
你还可以导入 List
,然后使用下面的代码:
from typing import List
self.arrayOfGhosts: List[Ghost] = []
Python是一种动态语言,所以没有“类型数组”这个概念。
你可以用下面的代码创建一个空的通用列表:
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())
这些是列表,不是数组。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语言的数据类型。大多数情况下,数组在Python中并不是合适的抽象层次。
附注:如果你在使用xrange
,那么你一定是在用Python 2。除非你需要非常特定的库,否则请停止使用,转而使用Python 3。看看原因。
附附注:在C++中,你用NULL
来初始化,而不是0
。绝不要用0
来表示NULL
。
附附附注:请查看PEP 8,这是Python的官方风格指南。