python随机随机播放while循环

Posted

技术标签:

【中文标题】python随机随机播放while循环【英文标题】:python random shuffle while loop 【发布时间】:2016-12-29 13:18:32 【问题描述】:

我正在尝试使用相同初始列表的排列来填充列表。我不明白为什么以下内容不起作用。

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]]]

【问题讨论】:

【参考方案1】:

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)

可能的输出:

[[[3, 1, 2, 4], [5, 7, 6, 8]], [[1, 2, 4, 3], [6, 7, 5, 8]]]
[[[1, 3, 2, 4], [4, 2, 1, 3]], [[2, 4, 3, 1], [4, 3, 2, 1]]]
[[[7, 5, 6, 8], [3, 2, 4, 1]], [[8, 5, 6, 7], [1, 4, 3, 2]]]

【讨论】:

或使用切片复制列表newval[:] 更好,你是对的。在这种情况下,我们知道这是一个列表,但我承认这更优雅(也可能稍微快一点) 感谢让-弗朗索瓦!有用!我想我明白了,但我不确定:在for 循环中,我附加了对newval 的引用,而不是它的值,所以最后最后一个洗牌的数组被复制到任何地方。是这样吗? 没错。 Shuffle 可以正常工作,但很多人试图获取它的返回值,或者犯了你所犯的错误。【参考方案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))

【讨论】:

你的回答很好,但可以通过添加代码示例来改进。

以上是关于python随机随机播放while循环的主要内容,如果未能解决你的问题,请参考以下文章

while循环中的随机数[C编程] [重复]

Javaswitch+for循环语句+while循环+do...while循环+Random产生随机数

Rcpp - 在 for 和 while 循环中加速随机正常绘制

python循环语句while

java基础之while循环练习

批量添加用户,并设置8位随机密码(禁止使用for,while等循环)