如何创建可容纳10个元素的空列表?

之后,我想在该列表中分配值。例如:

xs = list()
for i in range(0, 9):
   xs[i] = i

但是,这会导致IndexError:list赋值索引超出范围。为什么?


编者按:

在Python中,列表没有设置容量,但无法分配给尚未存在的元素。这里的答案显示了创建一个列表的代码,其中包含10个稍后要替换的“伪”元素。然而,遇到这个问题的大多数初学者实际上只是想通过向列表中添加元素来构建列表。这应该使用.append方法来完成,尽管通常会有特定于问题的方法来更直接地创建列表。请参阅为什么此迭代列表增长代码会导致IndexError:列表分配索引超出范围?如何重复向列表中添加元素?详细信息。


当前回答

varunl目前接受的答案

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

适用于数字等非引用类型。不幸的是,如果要创建列表列表,将遇到引用错误。Python 2.7.6中的示例:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

如您所见,每个元素都指向同一列表对象。为了解决这个问题,可以创建一个方法,将每个位置初始化为不同的对象引用。

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

可能有一种默认的、内置的python方式(而不是编写函数),但我不确定它是什么。很高兴得到更正!

编辑:范围(10)内的_为[[]

例子:

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

其他回答

如何创建可容纳10个元素的空列表?

所有列表都可以容纳任意数量的元素,只受可用内存的限制。列表中唯一重要的“大小”是其中当前元素的数量。

但是,这会导致IndexError:list赋值索引超出范围。为什么?

第一次通过循环时,i等于0。因此,我们尝试xs[0]=0。这不起作用,因为列表中当前有0个元素,因此0不是有效的索引。

我们不能使用索引来写入不存在的列表元素——我们只能覆盖现有的元素。相反,我们应该使用.append方法:

xs = list();
for i in range(0, 9):
   xs.append(i)

您将注意到的下一个问题是,列表实际上只有9个元素,因为范围函数跳过了终点。(正如旁注:[]与list()一样有效,分号是不必要的,如果从0开始,范围只需要一个参数。)解决这些问题可以:

xs = []
for i in range(10):
    xs.append(i)

然而,这仍然缺少标记-range并不是某种神奇的关键字,它是语言的一部分,例如def。

在2.x中,range是一个函数,它直接返回我们已经想要的列表:

xs = range(10) # 2.x specific!
# In 3.x, we don't get a list; we can do a lot of things with the
# result, but we can't e.g. append or replace elements.

在3.x中,range是一个设计巧妙的类,range(10)创建了一个实例。为了获得所需的列表,我们可以简单地将其输入到列表构造函数:

xs = list(range(10)) # correct in 3.x, redundant in 2.x
s1 = []
for i in range(11):
   s1.append(i)

print s1

要创建列表,只需使用以下括号:“[]”

要向列表中添加内容,请使用list.append()

这是我的python 2D列表代码,它将从输入中读取行数:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

我有点惊讶,创建初始化列表的最简单方法不是在这些答案中。只需在列表函数中使用生成器:

list(range(9))

您可以将(元素)追加到列表中,例如:

s1.append(i)

您当前试图做的是访问不存在的元素(s1[i])。