为什么添加“print(list(solutions))”会改变脚本的输出?

时间:2015-11-11 18:59:02

标签: python

以下是8-queen问题的解决方案。我添加了一行来进行调试,但它改变了输出。有人能告诉我这是什么原因吗? 请尝试评论并取消注释“#print(list(solutions))”,你就会明白我的意思。谢谢,

    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)

1 个答案:

答案 0 :(得分:2)

因为solutions是一个生成器,所以当你致电print(list(solutions))时,你会耗尽发电机。您必须将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 = [[]],因为你会立即覆盖它。