python在循环时随机洗牌

python在循环时随机洗牌,python,list,random,while-loop,Python,List,Random,While Loop,我试图用相同初始列表的排列来填充列表。我不明白为什么下面的方法不起作用 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) parts=[],[] 而len(零件[-1])

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

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)
parts=[],[]
而len(零件[-1])<2:
newval=random.choice([[1,2,3,4],[5,6,7,8])
对于部分中的部分:
随机。随机(newval)
附加部分(newval)
预期结果如下:
[[6,7,8,5],[1,3,4,2],[[5,8,6,7],[4,2,3,1]]
random.shuffle
在适当的位置工作,并因此修改
newval
。当附加到
部分时,您必须复制一份,否则相同的列表(或列表引用)将被洗牌并存储在
部分中

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)

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

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

若要解决此问题,请尝试附加
copy.copy(newval)
,而不仅仅是
newval
(不要忘记导入副本

以下是相应更改的代码:

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))
导入副本
零件=[],[]
而len(零件[-1])<2:
newval=random.choice([[1,2,3,4],[5,6,7,8])
对于部分中的部分:
随机。随机(newval)
part.append(copy.copy(newval))

或对列表副本使用切片
newval[:]
更好,你是对的。在这种情况下,我们知道这是一个列表,但我承认(可能也稍微快一点)这更优雅,谢谢让·弗朗索瓦!它起作用了!我想我知道了,但我不确定:在
for
循环中,我添加了对
newval
的引用,而不是它的值,因此最后一个无序数组被复制到了所有地方。是吗?没错。Shuffle在适当的位置工作,但是很多人试图获得它的返回值,或者犯了你犯的错误。你的答案是好的,但是可以通过添加代码示例来改进。
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))