Python 列表的列表赋值

0 投票
4 回答
6388 浏览
提问于 2025-04-18 04:42

首先要说明一点:不,这不是一个关于为什么的问题。

someThing = [[]] * 10
someThing[0] = 1

这个代码的结果是 [1,1,1,1,1,1,1,1,1,1]。

我的问题有点复杂:

x, y, z = ([[]] for i in range(3))

现在我给一个值:

x[0] = 1   # This works fine

然后我再给另一个值:

x[1] = 2   # This does not work anymore

结果我遇到了一个错误:IndexError:列表赋值索引超出范围。

我该怎么做才能让它正常工作呢?如你所见,我想要一个空列表,里面包含3个其他列表,我可以往里面添加值。

提前谢谢你们!

4 个回答

0

比较一下下面这两段代码的输出:

for i in [[]] * 3:
    print id(i)

和:

for i in ([[]] for j in range(3)):
    print id(i)

可能会帮助你找到答案。

2

也许可以试试这样的方法。

lists = [[] for i in range(3)]

这样运行的结果会是:

[[],[],[]]

如果你想访问或添加一些元素,可以这样做:

lists[0].append(1)
lists[0].append(2)
lists[1].append('a')
lists[1].append('b')

这样运行的结果会是:

[[1, 2], ['a', 'b'], []]
3

从什么时候开始

someThing = [] * 10
someThing[0] = 1

会得到 [1,1,1,1,1,1,1,1,1,1] 呢?这是一个索引错误(你不能在一个不存在的索引上赋值),因为实际上 []*10 == []。你的代码也正好做了同样的事情(我指的是索引错误)。这一行

x, y, z = ([[]] for i in range(3))

是简化(或者不简化)为

x, y, z = [[]], [[]], [[]]

所以 x[1] 就是一个索引错误。

3

我想要一个空列表,里面包含三个其他列表,我可以往里面添加值。

你说的问题其实是:"我想要一个包含三个空列表的列表"(一个东西不可能同时是空的又包含东西)。

如果你想要这个,为什么要用这么复杂的方法呢?直接的方法不是更好吗?

empty_list = [[], [], []]

如果你有这样的一个列表,当你执行 empty_list[0] = 1 时,结果会是:

empty_list = [1, [], []]

其实你应该用 empty_list[0].append(1),这样你得到的结果是:

empty_list = [[1], [], []]

如果你想创建任意数量的嵌套列表:

empty_list = []
for i in range(0, 15):
   empty_list.append([])

撰写回答