python随机洗牌while循环

2024-06-17 09:01:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用相同初始列表的排列来填充列表。我不明白为什么下面的方法不起作用。在

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval)

预期结果如下: [[[6,7,8,5],[1,3,4,2]],[[5,8,6,7],[4,2,3,1]]]


Tags: 方法in列表forlenrandompartsshuffle
2条回答

因为在Python中,一切都是引用。当您将值追加到数组时,实际上是将引用添加到内存中存储值的位置。在

例如,您已经将列表分配给第一个元素。在下一次迭代中重新洗牌此列表时,您将更改内存中的值。因此,访问在上一步中附加的元素时将要使用的值也将更改。在

要解决这个问题,请尝试附加copy.copy(newval),而不是仅仅newval(别忘了import copy

以下是相应更改的代码:

import copy
parts = [[],[]]
while len(parts[-1]) < 2:
    newval = random.choice([[1,2,3,4],[5,6,7,8]])
    for part in parts:
        random.shuffle(newval)
        part.append(copy.copy(newval))

random.shuffle在适当的地方工作,因此会修改newval。当附加到part时,必须制作一个副本,否则相同的列表(或列表引用)将被无序处理并存储在part中。在

import random

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval[:])

print(parts)

可能的输出:

^{pr2}$

相关问题 更多 >