0

我正在尝试迭代地打乱一个包含 4 个元素的列表,然后将打乱的列表附加到一个不断增长的列表中。结果将是一个长度为 4 个元素的倍数的列表,每四个元素是我原始列表的某种组合。

我的代码是

import random
list1 = ['X','Y','Z','Q']
list2 = []
for drop in range(0,72/4):
     random.shuffle(list1)
     list2.append(list1)

我似乎遇到的问题是 list2 将一遍又一遍地成为 list1 的相同洗牌版本。

示例列表2:['Q','X',Z','Y','Q','X',Z','Y','Q','X',Z','Y',。 ..]

4

3 回答 3

5

我想你想写

list2.extend(list1)

否则,您将一遍又一遍地将对象 list1的相同实例添加到 list2。

于 2012-04-13T15:38:37.133 回答
2

当您将一个列表附加到另一个列表时,您并没有制作该列表的副本 - 您正在将另一个引用附加到原始列表。你所有的追加尝试实际上都是对同一个对象的引用,对一个对象的修改就是对所有对象的修改。

这是这个令人惊讶的结果的演示。

>>> list1 = ['X', 'Y', 'Z', 'Q']
>>> list2 = []
>>> list2.append(list1)
>>> list2.append(list1)
>>> list2
[['X', 'Y', 'Z', 'Q'], ['X', 'Y', 'Z', 'Q']]
>>> list2[0][0] = 'A'
>>> list2
[['A', 'Y', 'Z', 'Q'], ['A', 'Y', 'Z', 'Q']]
>>> list1[0] = 'B'
>>> list2
[['B', 'Y', 'Z', 'Q'], ['B', 'Y', 'Z', 'Q']]
于 2012-04-13T15:53:43.487 回答
0

当您将 list1 随机播放到位时,您会随机播放 list1 的所有实例。当您将 list1 附加到 list2 时,您只是一遍又一遍地改组同一个列表。

尝试使用深拷贝

import random, copy
list1 = [1,2,3,4]
list2 = []
for i in xrange(10):
    random.shuffle(list1)
    list2.append(copy.deepcopy(list1))
于 2012-04-13T15:41:11.843 回答