Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表乘法:重复多个元素并遵从_Python_List - Fatal编程技术网

Python 列表乘法:重复多个元素并遵从

Python 列表乘法:重复多个元素并遵从,python,list,Python,List,我已经找到了许多解决方案,可以在取消引用重复元素的同时重复列表列表,如下所示: [[1,2] for x in range(3)] : [[1, 2], [1, 2], [1, 2]] mylist = [var1, var2, var1, var2, va1, var2] 但是,我实际上有一个对象列表,需要在列表中串联重复,如下所示: [[1,2] for x in range(3)] : [[1, 2], [1, 2], [1, 2]] mylist = [var1, var2, va

我已经找到了许多解决方案,可以在取消引用重复元素的同时重复列表列表,如下所示:

[[1,2] for x in range(3)]
: [[1, 2], [1, 2], [1, 2]]
mylist = [var1, var2, var1, var2, va1, var2]
但是,我实际上有一个对象列表,需要在列表中串联重复,如下所示:

[[1,2] for x in range(3)]
: [[1, 2], [1, 2], [1, 2]]
mylist = [var1, var2, var1, var2, va1, var2]
没有额外的内部列表<代码>变量1应被复制,而不是引用,这样对
mylist[0]
的更改也不会更改
mylist[2]
mylist[4]

使用乘法/理解来实现这一点是否有一个可读的单行线?这是用户可能必须经常对my类执行的操作,而
for()
循环将使他们的列表结构的可读性大大降低。我已经很难过,我们不能只使用
[var1,var2]*30而不重载
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这将使他们的代码如此可读


例如,下面使用的
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
在整个列表中传播,而不是只更改第一个元素。

您需要

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]]
你需要

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]]

我不太清楚你想要什么样的行为。根据您的需要,以下两个选项之一可能是正确的:

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]

我不太清楚你想要什么样的行为。根据您的需要,以下两个选项之一可能是正确的:

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]

为什么必须复制
varX
引用的对象?它们是可变对象吗?你需要深度副本还是浅层副本就足够了?
map(list,repeat([1,2],30))
使用from。或者仅仅
list(repeat([1,2],30))
@drno梦魇否,这样每次都会给出相同的
[1,2]
列表。为什么
varX
引用的对象必须被复制?它们是可变对象吗?你需要深度复制还是浅层复制就足够了?
map(list,repeat([1,2],30))
使用from。或者只
list(repeat([1,2],30))
@drno梦魇否,每次都会给出相同的
[1,2]
列表。谢谢,我原以为
deepcopy(3*[var1,var2])
会奏效,但它们似乎仍然相互引用-对
mylist[0]
的更改也在更改
mylist[2]
&
mylist[4]
。(很抱歉,无法将示例代码粘贴到此处-不接受换行符)向问题添加了代码,说明了为什么我需要它,但它不起作用。我将在今天晚些时候尝试第二种方法。谢谢哇,废话,你完全正确。谢谢你指出这一点——我对deepcopy的工作原理考虑得不够仔细。它将复制一组对象,包括它们相互之间的内部引用,这样新集合中复制的对象就不会引用旧集合。但对于旧集合中的每个“内部”引用,复制的集合中都存在相同的“内部”引用。(更新了答案并进行了更正。)谢谢,我本以为
deepcopy(3*[var1,var2])
会起作用,但它们似乎仍然相互引用-对
mylist[0]
的更改也在更改
mylist[2]
mylist[4]
。(很抱歉,无法将示例代码粘贴到此处-不接受换行符)向问题添加了代码,说明了为什么我需要它,但它不起作用。我将在今天晚些时候尝试第二种方法。谢谢哇,废话,你完全正确。谢谢你指出这一点——我对deepcopy的工作原理考虑得不够仔细。它将复制一组对象,包括它们相互之间的内部引用,这样新集合中复制的对象就不会引用旧集合。但对于旧集合中的每个“内部”引用,复制的集合中都存在相同的“内部”引用。(用更正更新了答案。)