我发现了许多关于如何重复引用列表的解决方案,同时取消引用重复的元素,如下所示:
[[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
在整个列表中传播,而不是只更改第一个元素。
答案 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]