Python中自定义对象列表的列表

时间:2012-03-03 03:54:33

标签: python list

我试图弄清楚如何正确地声明对象列表(列表)列表。请考虑以下Python代码:

short_list = [] * 5
for in range(5):
  c = MyClass()
  short_list.append(c)

super_list = [[short_list] * 100] * number_of_users

super_list [0]旨在成为其他列表的列表,其中包含与用户0相关的信息,用户1的super_list [1],继续。这些列表最终组织了“MyClass”类型的对象组。我的问题是在super_list [0]中设置列表元素的值也会改变super_list [1]中的相应列表元素。 super_list [0]和super_list [1]总是完全一样。

如何声明short_list和/或super_list,以便给出我想要实现的列表的相同概念组织,以便super_list [0]和super_list [1]作为两个单独的列表行事?

2 个答案:

答案 0 :(得分:0)

您必须手动构建它们:

super_list = []
for i in xrange(100):
    short_list = []
    for j in xrange(5):
        short_list.append(MyClass())
    super_list.append(short_list)

或者,更短,但可能不太可读:

super_list = [[MyClass() for j in xrange(5)] for i in xrange(100)]

答案 1 :(得分:0)

[] * 5等于Python中的[](在交互式解释器或IPython中尝试)。

构建super_list时,您希望复制列表。默认情况下,分配一个列表(即*运算符后面的内容)仅生成一个新引用。试试这个:

[ short_list[:] for stub in xrange(100) ]

使用切片语法多次克隆列表。这是Pythonic浅层复制列表的方式。

如果您需要深层复制,可以import copy并使用deepcopy方法。