Python 为何要加上;打印(列表(解决方案)”;是否更改脚本的输出?

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

以下是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(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不是这些语言之一。如果下面的答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决到令你满意的程度,并让帮助你的人相信你的帮助。我需要一个完整的解释。