Python列表分配

时间:2014-04-29 08:17:39

标签: python list

首先要做的一件事:不,这不是一个关于为什么

的问题
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 :(得分: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]是索引错误。

答案 1 :(得分:3)

  

我想要一个空列表,其中包含我可以附加的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([])

答案 2 :(得分:1)

也许这样的事情可行。

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 :(得分:0)

比较输出:

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

使用:

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

可能有助于回答您的发现。