def check(a,i):
n = len(a)
return not (i in a or
i+n in [a[j]+j for j in range(n)] or
i-n in [a[j]-j for j in range(n)])
def rsearch(N):
global a
global b
if len(a) == N:
b.append(a) #<-- this works HERE
print(a) #<-- this also works HERE
return True
z = False
for i in range(N):
if check(a,i):
a.append(i)
z = rsearch(N) or z
del a[-1]
return z
a = []
b = []
rsearch(8)
print(a) #<-- empty list ??
print(b) #<-- list of 92 empty lists ?? ??
print(len(b)) #<-- returns 92所以我用Python编写了8 Queens问题的这个实现,它可以工作,但是我有一些格式化问题。在我的len(a) == N检查中,我打印了解决方案列表,工作得很好,我将解决方案列表附加到另一个列表,b,这在那个时候很好。但是最后一个print(a)返回一个空列表,而print(b)返回一个包含92个空列表的列表,它找到了每个解决方案,但它们都是空的。谁知道我做错了什么,为什么是空的?
发布于 2018-12-01 02:08:20
关于为什么a是空的:您执行a.append(i),然后执行del a[-1]。这有效地将一个元素附加到a中,然后再次删除它。因此,总数将保持为零。
关于为什么b只包含空列表:将a附加到b (b.append(a)),因此b存储对a指向的列表的引用。因为a是一个空列表,所以b包含对同一个空列表a的92个(类似的)引用。如果您应该附加一个a的副本,例如b.append([x for x in a])。
https://stackoverflow.com/questions/53567154
复制相似问题