Python使用随机模块创建嵌套列表

Python使用随机模块创建嵌套列表,python,list,python-3.x,random,nested-lists,Python,List,Python 3.x,Random,Nested Lists,假设我想要创建一个带有数字序列的嵌套列表,并且我不想要重复的列表序列 i、 e.我想这样:[[1,2,3,4],[2,1,3,4],[4,2,3,1],其中列表的len取决于我在有限的尝试中可以生成多少个不重复的数字序列(以下情况下为四次尝试) 这是我的第一次尝试: import random rng = random.Random() bd =list(range(4)) i = 0 result =[] while i <4: rng.shuffle(bd) if b

假设我想要创建一个带有数字序列的嵌套列表,并且我不想要重复的列表序列

i、 e.我想这样:
[[1,2,3,4],[2,1,3,4],[4,2,3,1]
,其中列表的
len
取决于我在有限的尝试中可以生成多少个不重复的数字序列(以下情况下为四次尝试)

这是我的第一次尝试:

import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]

while i <4:
    rng.shuffle(bd)
    if bd not in result:
        result.append(bd)
    i +=1
print(result)
结果:
[[3,2,0,1],[1,0,3,2],[0,1,3,2]]

我所做的只是在每个循环中重新设置列表
bd

根据我的理解,列表
bd
在每个循环中都会被洗牌,因此将
bd
重置为
[0,1,2,3]
应该没有意义。
有人能给我解释一下为什么修改后的代码可以工作吗?谢谢

在您的第一次尝试中,每次都会洗牌并将相同的列表附加到结果中。尝试使用副本,从整个列表中选取一部分:
bd[:]
是一个完全独立的对象,下次在循环中洗牌原始的
bd
时不会更改

import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]

while i <4:
    rng.shuffle(bd)
    if bd not in result:
        result.append(bd[:])
    i +=1
print(result)

在您的第一次尝试中,每次都会洗牌并将相同的列表追加到结果中。尝试使用副本,从整个列表中选取一部分:
bd[:]
是一个完全独立的对象,下次在循环中洗牌原始的
bd
时不会更改

import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]

while i <4:
    rng.shuffle(bd)
    if bd not in result:
        result.append(bd[:])
    i +=1
print(result)

Python中的列表和类似对象通过引用被引用。考虑下面的简单例子:

a_list = [1,2,3,4,5]
another_list = []

for i in range(5):
    another_list.append(a_list)
    a_list[0] = i + 10

print(another_list)
您希望输出为:

[[10, 2, 3, 4, 5], [11, 2, 3, 4, 5], [12, 2, 3, 4, 5], [13, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
但是,您看到的输出是:

[[14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
每次调用另一个列表。追加(列表),都会向
列表
追加一个引用。然后更改列表,前面附加的引用指向已更改的列表

最后,
a_列表
等于
[14,2,3,4,5]
,而
另一个_列表
包含对该列表的五个相同引用


回到你的案子上来。为了防止这种情况发生,您可以在每次附加列表时创建列表的副本:

随机导入
rng=random.random()
i=0
结果=[]

而Python中的i列表和类似对象是通过引用来引用的。考虑下面的简单例子:

a_list = [1,2,3,4,5]
another_list = []

for i in range(5):
    another_list.append(a_list)
    a_list[0] = i + 10

print(another_list)
您希望输出为:

[[10, 2, 3, 4, 5], [11, 2, 3, 4, 5], [12, 2, 3, 4, 5], [13, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
但是,您看到的输出是:

[[14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5], [14, 2, 3, 4, 5]]
每次调用另一个列表。追加(列表)
,都会向
列表
追加一个引用。然后更改列表,前面附加的引用指向已更改的列表

最后,
a_列表
等于
[14,2,3,4,5]
,而
另一个_列表
包含对该列表的五个相同引用


回到你的案子上来。为了防止这种情况发生,您可以在每次附加列表时创建列表的副本:

随机导入
rng=random.random()
i=0
结果=[]

虽然我发生这种情况是因为您将
bd
附加到
result
中,并且在下一次迭代中使用
bd
,它们具有相同的引用。

在第二个迭代中,在每个迭代中生成一个新列表(不同的引用)

发生这种情况是因为您将
bd
附加到
result
中,并且在下一次迭代中使用
bd
,它们具有相同的引用。

在第二个迭代中,在每个迭代中生成一个新列表(不同的引用)

您的代码有一个小问题:shuffle执行就地更改,因此它会更改变量引用的对象。通过运行第一个代码,您将始终得到一个结果——最后一个洗牌操作。为避免此情况,您应附加一份列表副本:

import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]

while i <4:
    rng.shuffle(bd)
    if bd not in result:
        result.append(bd[:])
    i +=1
print(result)
随机导入
rng=random.random()
bd=列表(范围(4))
i=0
结果=[]

虽然我您的代码有一个小问题:shuffle执行就地更改,因此它会更改变量引用的对象。通过运行第一个代码,您将始终得到一个结果——最后一个洗牌操作。为避免此情况,您应附加一份列表副本:

import random
rng = random.Random()
bd =list(range(4))
i = 0
result =[]

while i <4:
    rng.shuffle(bd)
    if bd not in result:
        result.append(bd[:])
    i +=1
print(result)
随机导入
rng=random.random()
bd=列表(范围(4))
i=0
结果=[]

而我也看到了感谢阿尔基马雷德斯。现在一切都有意义了,谢谢你。现在一切都有意义了。谢谢WoLy:)解决我问题的清晰答案谢谢WoLy:)解决我问题的清晰答案