Skip to main content
 首页 » 编程设计

Python:在for循环中洗牌每次都以相同的方式洗牌

2025年05月04日26think

我有一个数字列表 [1,2,3,4,5]。我想制作一个列表,其中包含 [1,2,3,4,5] 的不同排列(即它是一个列表列表)。

例如,我想要类似的东西 [[1,4,5,3,2], [3,1,4,5,2],[5,1,2,4,3]].

import random 
from random import shuffle 
 
superlist = [] 
littlelist = [1,2,3,4,5] 
 
for i in range(1, 4): 
    random.shuffle(little_list) 
    superlist.append(little_list) 
print(superlist) 

这输出

[[2, 5, 4, 3, 1], [2, 5, 4, 3, 1], [2, 5, 4, 3, 1]] 

所以在我的 for 循环中,“随机洗牌”产生相同的结果。我试过时间播种,但也有同样的问题。

请您参考如下方法:

当您调用 random.shuffle 时,您会就地随机播放列表,而不是制作副本。然后你将 little_list 附加到 superlist 但每次你打乱它的时候你都在打乱同一个列表。

尝试附加一个副本,然后您会看到不同之处:

for i in range(1, 4): 
    random.shuffle(little_list) 
    superlist.append(list(little_list)) 
print(superlist) 

Python 中的一切都通过操作对对象的引用来工作:当您将一个对象(例如 little_list)放入另一个对象时,您所做的就是让 superlist 持有对对象的引用原始的 little_list。除非您特别要求它复制对象,否则 Python 永远不会复制对象。您可以通过调用 list(...) 构造函数轻松复制列表,但即使这样也只能复制原始引​​用,因此如果您要复制 superlist 和操纵它包含的列表,您仍然会在原始 superlist 中看到这些更改。