1

已解决:似乎该问题仅出现在 PythonWin 中。我通过 IDLE 的 python shell 运行了所有东西,它工作得很好。必须是 PythonWin 的错误,而不是代码本身。

我似乎无法弄清楚为什么下面的代码给了我一个TypeError: 'type' object is not iterable

粘贴箱:http : //pastebin.com/VFZYY4v0

def genList(self):
    #recursively generates a sorted list of child node values
    numList = []
    if self.leftChild != 'none':
        numList.extend(self.leftChild.genList())  #error
    numList.extend(list((self.Value,)))
    if self.rightChild != 'none':
        numList.extend(self.rightChild.genList()) #error
    return numList

添加子节点的代码(正常工作)

def addChild(self, child):
    #add a child node. working
    if child.Value < self.Value:
        if self.leftChild == 'none':
            self.leftChild = child
            child.parent = self
        else:
            self.leftChild.addChild(child)
    elif child.Value > self.Value:
        if self.rightChild == 'none':
            self.rightChild = child
            child.parent = self
        else:
            self.rightChild.addChild(child)

任何帮助,将不胜感激。

完整的解释器会话: >>> import BinTreeNode as BTN
>>> node1 = BTN.BinaryTreeNode(5)
>>> node2 = BTN.BinaryTreeNode(2)
>>> node3 = BTN.BinaryTreeNode(12)
>>> node3 = BTN .BinaryTreeNode(16)
>>> node4 = BTN.BinaryTreeNode(4)
>>> node5 = BTN.BinaryTreeNode(13)
>>> node1.addChild(node2)
>>> node1.addChild(node3)
>>> node1. addChild(node4)
>>> node1.addChild(node5)
>>> node4.genList()
<class 'list'>
>>> node1.genList()
Traceback(最近一次调用最后):
文件“<交互式输入>” ,第 1 行,在 <模块>
文件“C:...\python\BinTreeNode.py”,第 47 行,在 genList
numList.extend(self.leftChild.genList()) #error
文件“C:...\python\BinTreeNode.py”,第 52 行,在 genList
TypeError: 'type' object is not iterable

4

2 回答 2

0

我会添加一些打印来查看它给出错误时的实际类型,例如:

def genList(self):
    #recursively generates a sorted list of child node values
    numList = []
    if self.leftChild != 'none':
        print self.leftChild.genList(), type(self.leftChild.genList())
        numList.extend(self.leftChild.genList())  #error
    numList.extend(list((self.Value,)))
    if self.rightChild != 'none':
        print self.rightChild.genList(), type(self.rightChild.genList())
        numList.extend(self.rightChild.genList()) #error
    return numList

一个不那么疯狂的猜测...尝试使用 [self.Value] 代替 list((self.Value,))。我觉得它会起作用...... :-)

于 2012-12-01T03:00:23.063 回答
0

您的示例中没有任何内容表明问题出在哪里,但这意味着您以某种方式返回对象类型而不是对象实例。在这一点上,我所能提供的只是建议另一种方法来重做该genList()方法,看看它是否能神奇地解决您的问题。

您可以尝试通过递归传递相同的结果列表,而不是返回许多临时的:

def genList(self, numList=None):
    if numList is None:
        numList = []

    if self.leftChild != 'none':
        self.leftChild.genList(numList)

    numList.append(self.Value)

    if self.rightChild != 'none':
        self.rightChild.genList(numList)

    return numList

results = rootNode.genList()

另外,您使用'none'而不是有原因None吗?我只会使用 aNone而不是字符串。

我对您的版本的建议编辑在这里: http: //pastebin.com/FGf8Lcdu

这是您在 python3.3 下的相同解释器代码的输出:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:>>> import BinTreeNode as BTN
:>>> node1 = BTN.BinaryTreeNode(5)
:>>> node2 = BTN.BinaryTreeNode(2)
:>>> node3 = BTN.BinaryTreeNode(12)
:>>> node3 = BTN.BinaryTreeNode(16)
:>>> node4 = BTN.BinaryTreeNode(4)
:>>> node5 = BTN.BinaryTreeNode(13)
:>>> node1.addChild(node2)
:>>> node1.addChild(node3)
:>>> node1.addChild(node4)
:>>> node1.addChild(node5)
:<EOF>

In [2]: node4.genList()
Out[2]: [4]

In [3]: node1.genList()
Out[3]: [2, 4, 5, 13, 16]
于 2012-12-01T03:59:36.520 回答