列表乘法:重复多个元素和参考

时间:2017-03-18 15:44:54

标签: python list

我发现了许多关于如何重复引用列表的解决方案,同时取消引用重复的元素,如下所示:

[[1,2] for x in range(3)]
: [[1, 2], [1, 2], [1, 2]]

但是,我实际上有一个需要在List中内联重复的对象列表,如下所示:

mylist = [var1, var2, var1, var2, va1, var2]

没有额外的内部列表。 var1应该复制,而不是引用,以便对mylist[0]的更改也不会更改mylist[2]& mylist[4]等。

是否有可读的单行使用乘法/理解来执行此操作?这是用户可能不得不经常使用我的类进行的操作,而for()循环将使其列表的构造更不易读。我已经很难过,我们只能使用[var1, var2] * 30而不会超载__mult__,这是我试图避免的。这会使他们的代码变得如此可读。

例如,以下deepcopy()的使用不够好,因为引用了对象并因此意外地改变了

>>> obj1=[1]; obj2=[200]
>>> a=deepcopy( 3*[obj1, obj2] )
>>> a
[[1], [200], [1], [200], [1], [200]]
>>> a[0][0]=50
>>> a
[[50], [200], [50], [200], [50], [200]]

50在整个列表中传播,而不是只更改第一个元素。

2 个答案:

答案 0 :(得分:2)

你需要

import copy
[copy.copy(y) for x in range(3) for y in [var1, var2]]

或浅拷贝是不够的

[copy.deepcopy(y) for x in range(3) for y in [var1, var2]]

答案 1 :(得分:1)

我不太确定你在寻找什么行为。根据您的需要,这两个选项中的一个可能是正确的:

In [0]: from itertools import chain

In [1]: from copy import deepcopy

In [2]: [deepcopy(x) for x in 3*[var1, var2]]
Out[2]: [[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]]

In [3]: list( chain( *(3*[var1, var2]) ) )
Out[3]: [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]