如何创建一个特定类型的空列表

15 投票
5 回答
40019 浏览
提问于 2025-04-18 09:24

我想知道怎么创建一个特定类型的空对象列表,这可能吗?我想创建一个对象数组(这个类型叫做“Ghosts”),以后会包含不同类型的对象,这些对象都是从这个“Ghosts”类继承来的。在C++里这很简单,但我不太确定在Python里怎么做。我试过类似这样的代码:

self.arrayOfGhosts = [[Ghost() for x in xrange(100)] for x in xrange(100)]

但是这个列表已经被对象初始化了,而我并不需要这样,有没有办法让它初始化为0,但仍然保持类型为“Ghost”的列表呢?

如你所见,我对Python还很陌生。任何帮助都会非常感激。

5 个回答

0

在Python 3.9版本之后,from typing import List这个写法已经不推荐使用了。
现在你不需要再单独导入什么东西了,可以直接使用list这个词。
举个例子:
my_list: list[float] = list() 这行代码的意思是创建一个可以存放浮点数的空列表。

2

在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中,这并不是必须的,因为集合类型可以直接进行遍历。

5

从Python 3.5开始,你可以这样做:
https://docs.python.org/3/library/typing.html

self.arrayOfGhosts: list[Ghost] = []

你还可以导入 List,然后使用下面的代码:

from typing import List

self.arrayOfGhosts: List[Ghost] = []
10

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())
3

这些是列表,不是数组。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的官方风格指南。

撰写回答