【问题标题】:Python: shuffle within a for loop shuffles the same way every timePython:for循环中的随机播放每次都以相同的方式随机播放
【发布时间】:2016-05-05 07:53:55
【问题描述】:

我有一个数字列表 [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 循环中,“随机洗牌”会产生同样的结果。我尝试过播种,但也有同样的问题。

【问题讨论】:

    标签: python random shuffle


    【解决方案1】:

    当您致电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.

    【讨论】:

    • 我知道我正在改组同一个列表,但我想如果它是随机改组,我会在超级列表中添加不同的内容。
    • 不,您的超级列表只是[little_list, little_list, little_list],每次都使用相同的子列表,您对little_list 所做的每个更改在superlist 中可见3 次。
    • 我明白了。因此,您的方法不是附加 little_list,而是附加刚刚洗牌的 little_list 副本。再次洗牌 little_list 不会影响此副本。对吗?
    • 是的,您可以在改组之前或之后复制它,但重要的是每个副本都是一个单独的对象,因此它们可以独立更改,而在您的原始代码中,它们都是刚刚引用的相同对象不同的路线。
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多