Python列表在循环中不洗牌
我正在尝试通过循环来创建一个随机的键列表:
import random
keys = ['1', '2', '3', '4', '5']
random.shuffle(keys)
print keys
这个方法效果很好。但是,如果我把它放在一个循环里,并捕捉输出:
a = []
for x in range(10):
random.shuffle(keys)
a.append(keys)
我得到的结果是同样的洗牌结果出现了10次?!显然这里面有根本的问题... 提前谢谢大家。
2 个回答
3
Hypnos已经给出了一个非常正确的解决方案,所以我只是想用更直观的方式来帮助你理解发生了什么,以及将来如何发现类似的问题:
import random
keys = ['1', '2', '3', '4', '5']
a = []
for x in range(10):
random.shuffle(keys)
a.append(keys)
print a
结果是:
[['4', '5', '3', '2', '1']]
[['2', '5', '1', '4', '3'], ['2', '5', '1', '4', '3']]
[['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3']]
[['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2']]
[['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5']]
[['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5']]
[['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3']]
[['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1']]
[['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1']]
[['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1']]
另外,注意到 random.shuffle
这个函数并不会返回任何东西,你可以开始怀疑这个变换是 在原地进行的。
16
问题在于,你是在原地打乱列表,然后把这个列表的引用添加到组合列表中。这样一来,你就得到了10个相同的列表结构。“根本变化”就是在添加之前必须先复制这个列表。
这里有一种更“符合Python风格”的方法,可以用列表推导式来实现相同的结果。
import random def shuffleACopy(x): b = x[:] # make a copy of the keys random.shuffle(b) # shuffle the copy return b # return the copy keys = [1,2,3,4,5,6,7,8] a = [shuffleACopy(keys) for x in range(10)] print(a)