在我的脚本中,我需要生成一个简单的[1,2,3,4]值列表,然后分别在此列表中随机排列每个列表。我使用了random.shuffle()函数,该函数在单个数组上可以正常工作,但是当我尝试在for循环中使用它时,输出的是经过改组的数组的列表,但是它们都是相同的:
[3,1,2,4]
[3,1,2,4]
[3,1,2,4]
等等...
我尝试使用不同的python版本(2.7、3.6)运行脚本,但是问题仍然存在。
这是代表问题的简化代码:
import random
numbers_list = [1,2,3,4]
#make a list of 10 numbers_list
list_of_lists = [numbers_list]*10
#shuffle every list inside list_of_lists
for i in list_of_lists:
random.shuffle(i)
#print every list from list_of_lists
for a in list_of_lists:
print(a)
多次运行脚本会产生不同的列表,但是它们始终由重复的一个数组组成。我该如何解决?是random.shuffle()还是我的脚本有问题?我在做什么错了?
答案 0 :(得分:4)
您的问题是这一行:
list_of_lists = [numbers_list]*10
这将创建一个包含10个引用的列表,这些引用指向同一列表(numbers_list
)。您对任何列表所做的任何更改都会反映在所有10个副本中-因为它们是相同的列表。
改为执行以下操作:
list_of_lists = [numbers_list.copy() for _ in range(10)]
答案 1 :(得分:0)
罪犯在那里:
numbers_list = [1,2,3,4]
#make a list of 10 numbers_list
list_of_lists = [numbers_list]*10
现在list_of_lists
实际上是一个重复了十次的列表,您可以避免使用已经显示的.copy
方法或替换为:
list_of_lists = [numbers_list]*10
使用
list_of_lists = [list(numbers_list) for _ in range(10)]
或
list_of_lists = [numbers_list[:] for _ in range(10)]
可能要读第一个,我想要基于list
改用numbers_list
的新printf
,然后阅读第二个所谓的切片。