Shuffle 正在将列表 l 改组到位。您在列表列表中有同一个列表的多个实例,因此它们都会同时被打乱。
为了演示,在循环中添加print:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
par = []
l=list(range(1,11))
for i in range(pop_size):
print i,l, par
shuffle(l)
par.append(l)
return par
打印:
0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] []
1 [9, 6, 5, 7, 2, 4, 3, 1, 8, 10] [[9, 6, 5, 7, 2, 4, 3, 1, 8, 10]]
2 [4, 5, 6, 2, 9, 3, 7, 8, 1, 10] [[4, 5, 6, 2, 9, 3, 7, 8, 1, 10], [4, 5, 6, 2, 9, 3, 7, 8, 1, 10]]
[[6, 8, 7, 1, 5, 4, 9, 3, 2, 10], [6, 8, 7, 1, 5, 4, 9, 3, 2, 10], [6, 8, 7, 1, 5, 4, 9, 3, 2, 10]]
由于par 中的每个条目都只是同一个列表的一个视图,所以当您随机播放一个条目时,似乎 会随机播放所有条目。
要修复,每次循环创建一个新列表:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
par = []
for i in range(pop_size):
l=list(range(1,11)) # each one is a new list
shuffle(l)
par.append(l)
return par
更快的方法是使用sample vs shuffle,如下所示:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
l=range(1,11)
return [sample(l, k=len(l)) for _ in range(pop_size)]