我试图弄清楚如何正确地声明对象列表(列表)列表。请考虑以下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]作为两个单独的列表行事?
答案 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
方法。