要复制现有列表中的嵌套列表,不幸的是,仅将其相乘还不够,否则将创建引用,而不是列表中的独立列表,请参见以下示例:
x = [[1, 2, 3]] * 2
x[0] is x[1] # will evaluate to True
为了实现您的目标,您可以在列表理解中使用range函数,例如,请参见:
x = [[1, 2, 3] for _ in range(2)]
x[0] is x[1] # will evaluate to False (wanted behaviour)
这是一种不用创建引用就可以在列表中增加项目的好方法,而且在许多不同的网站上也会多次解释这一点。
但是,有一种更有效的方法来复制列表元素。对于我来说,该代码似乎快了一点(通过命令行通过timeit进行测量,对于下面的代码和上面代码中的范围(n),使用不同的参数n__1、50、100、10000_进行测量):
x = [[1, 2, 3] for _ in [0] * n]
但我想知道,为什么这段代码运行得更快?是否还有其他缺点(内存消耗更大或类似)?
python -m timeit '[[1, 2, 3] for _ in range(1)]'
1000000 loops, best of 3: 0.243 usec per loop
python -m timeit '[[1, 2, 3] for _ in range(50)]'
100000 loops, best of 3: 3.79 usec per loop
python -m timeit '[[1, 2, 3] for _ in range(100)]'
100000 loops, best of 3: 7.39 usec per loop
python -m timeit '[[1, 2, 3] for _ in range(10000)]'
1000 loops, best of 3: 940 usec per loop
python -m timeit '[[1, 2, 3] for _ in [0] * 1]'
1000000 loops, best of 3: 0.242 usec per loop
python -m timeit '[[1, 2, 3] for _ in [0] * 50]'
100000 loops, best of 3: 3.77 usec per loop
python -m timeit '[[1, 2, 3] for _ in [0] * 100]'
100000 loops, best of 3: 7.3 usec per loop
python -m timeit '[[1, 2, 3] for _ in [0] * 10000]'
1000 loops, best of 3: 927 usec per loop
# difference will be greater for larger n
python -m timeit '[[1, 2, 3] for _ in range(1000000)]'
10 loops, best of 3: 144 msec per loop
python -m timeit '[[1, 2, 3] for _ in [0] * 1000000]'
10 loops, best of 3: 126 msec per loop