Python: 在 for 循环中洗牌每次都以相同的方式洗牌
Python: shuffle within a for loop shuffles the same way every time
我有一个数字列表 [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' 产生相同的结果。我试过时间播种,但也有同样的问题。
当您调用 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
.
我有一个数字列表 [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' 产生相同的结果。我试过时间播种,但也有同样的问题。
当您调用 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
.