这种方式比嵌套列表推导更快[x[:] for x in [[foo] * 10] * 10] # for immutable foo!
这里有一些python3时序,适用于小型和大型列表$python3 -m timeit '[x[:] for x in [[1] * 10] * 10]'1000000 loops, best of 3: 1.55 usec per loop
$ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]'100000 loops, best of 3: 6.44 usec per loop
$ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]'100 loops, best of 3: 5.5 msec per loop
$ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]'10 loops, best of 3: 27 msec per loop
说明:
[[foo]*10]*10创建重复10次的同一对象的列表。你不能只使用它,因为修改一个元素将修改每一行中的相同元素!
x[:]相当于list(X)但更高效,因为它避免了名称查找。无论哪种方式,它都会创建每行的浅表副本,因此现在所有元素都是独立的。
所有元素都是相同的foo对象,所以如果foo是可变的,你就不能使用这个方案。你必须使用它import copy[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]
或者假设一个Foo返回foos 的类(或函数)[[Foo() for x in range(10)] for y in range(10)]