如何在不打乱原始列表的情况下对复制的列表进行洗牌?

8

我正在使用Python,想要将一个复制的列表打乱并写入到一个文本文件中(如下代码所示)。

为什么shuffle函数也会随机改变原来的列表?我只是在函数调用中使用了副本。

有什么想法吗?谢谢!

from random import shuffle

def shuffleList2txt(myList):
    shuffle(myList)

    f = open('randList.txt','w')
    f.write(str(liste))
    f.close()

    return(myList)


liste = [1,2,3,4,5,6,7,8,9,10]
copy = liste
shuffledList = shuffleList2txt(copy)

liste和shuffledList是一样的!为什么?liste应该是原始列表,而shuffledList应该是打乱后的列表.... :)


不确定你是否阅读过这篇文章,但我认为在你的情况下了解这个知识点是很有好处的。 - stucash
1
你和你的伴侣有一只狗。你叫她“Jo”,你的伴侣叫她“Krok”。现在你的伴侣打电话给一个美容服务来修剪Krok的毛发,你是否期望当你回家时,Jo仍然有长长的头发?虽然这个列表对象以两种不同的方式命名,但它仍然是同一只老狗!请参考这个问题(或任何关于此主题的数十个答案)来解决这个问题。 - gboffi
哈哈... 感谢gboffi提供这个精彩的解释 :) - HKC72
如果要对已复制的列表进行洗牌而不对原始列表进行洗牌,则需要对其进行洗牌。问题在于,所示代码未复制该列表。因此,实际问题是“如何复制一个列表?”,这是一个常见的重复问题。 - Karl Knechtel
1个回答

27

random.shuffle 是就地打乱列表的。当然,你可以在洗牌之前复制一份列表,但最好使用random.sample来获取整个列表的样本:

>>> l = [1,2,3,4]
>>> random.sample(l,len(l))
[3, 1, 2, 4]
>>> l
[1, 2, 3, 4]

使用random.sample的结果分配给一个变量后,将得到一个新的打乱顺序的列表,而不会改变原始列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接