Python:pop()返回py列表,而不是我的对象

时间:2019-03-06 11:47:41

标签: python python-3.x

我正在尝试编写一个练习来解决Python上的Queen Puzzle(是的,很典型,我知道)。我为董事会状态制作了一个名为Queens的类,该类吸收了每一边的长度和皇后区列表(如果有)。

在主程序中,我有一个名为list的{​​{1}}的{​​{1}},然后逐个弹出。但是,我从弹出窗口得到的结果似乎是Queens类型,而不是预期的frontier类型!

是什么原因造成的,该如何解决?

代码段:

list

预期输出:

Queens

实际输出:

from queens import Queens

def search(n, debug=False, max=6):
    frontier = [Queens(n, [])] # queue of states to explore
    while frontier != []:
        check = frontier.pop()
        print(type(check))
    if debug:
        print(str(numSolutions) + " | Checking:")
        print(check)
    v = check.validate()
    # EDIT: added more of the code; problem seems to arise here
    if v == 0:
        if debug:
            print("Solution!")
        numSolutions += 1
        if n <= max:
            solutions.append(check)
    elif v > 0:
        if debug:
            print(str(v) + " more")
        frontier.append(check.branch())
    else:
        if debug:
            print("Invalid state")
        pass

(是的,一种类型的语句打印了两行)

编辑:由于主要代码似乎没有问题,因此这是我定义类的文件:

<class 'queens.Queens'>

2 个答案:

答案 0 :(得分:1)

我知道了。该问题仅在frontier.append(check.branch())之后发生。 branch()返回list中的queens。我以为我要在queens上附加几个frontier,但实际上是在list上附加queens的{​​{1}}。将frontier更改为append解决了该问题。

答案 1 :(得分:0)

当您将frontier的结果附加到.branch(..)上并再次重复时,您将得到一个数组(列表)。循环后继续进行下一步的打印内容。

def branch(self):
        out = []
        for x in range(self.n):
            if x not in self.qlist:
                qlist = copy.deepcopy(self.qlist)
                qlist.append(x)
                out.append(Queens(self.n, qlist))
        return out