Python 为何要加上;打印(列表(解决方案)”;是否更改脚本的输出?
以下是8-queen问题的解决方案。我添加了一行进行调试,但它更改了输出。有人能告诉我是什么原因吗? 请尝试注释并取消注释“#打印(列表(解决方案)),您就会明白我的意思。谢谢Python 为何要加上;打印(列表(解决方案)”;是否更改脚本的输出?,python,Python,以下是8-queen问题的解决方案。我添加了一行进行调试,但它更改了输出。有人能告诉我是什么原因吗? 请尝试注释并取消注释“#打印(列表(解决方案)),您就会明白我的意思。谢谢 BOARD_SIZE = 8 def under_attack(col, queens): return col in queens or \ any(abs(col - x) == len(queens)-i for i,x in enumerate(qu
BOARD_SIZE = 8
def under_attack(col, queens):
return col in queens or \
any(abs(col - x) == len(queens)-i for i,x in enumerate(queens))
def solve(n):
solutions = [[]]
for row in range(n):
solutions = (solution+[i+1]
for solution in solutions # first for clause is evaluated immediately,
# so "solutions" is correctly captured
for i in range(BOARD_SIZE)
if not under_attack(i+1, solution))
#print(list(solutions))
return list(solutions)
answers = solve(BOARD_SIZE)
print(answers)
因为
solutions
是一个生成器,所以当您调用print(list(solutions))
时,您正在耗尽生成器。您必须将列表(解决方案)
分配给变量,然后打印/返回该变量。或者将生成器更改为列表。比如说
def solve(n):
solutions = [[]]
for row in range(n):
solutions = [solution+[i+1] for solution in solutions for i in range(BOARD_SIZE) if not under_attack(i+1, solution)]
print(solutions)
return solutions
我也不理解
solutions=[[]]
,因为您会立即覆盖它。在某些语言中,比如Clojure,您的惰性序列实际上从一开始就缓存了结果,因此您可以多次读取它们。Python不是这些语言之一。如果下面的答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决到令你满意的程度,并让帮助你的人相信你的帮助。我需要一个完整的解释。