今天在学习“机器人学习实战”这本书的第三章时,获取叶节点的数目和书的层数。按照书上的源代码编码运行后出现错误:
源代码:
def getNumLeafs(myTree):
numLeafs = 0
firstStr = myTree.keys()[0]
secondDict = myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__ == "dict":
numLeafs += getNumLeafs (secondDict[key])
else:
numLeafs += 1
return numLeafs
运行错误:
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
getNumLeafs(myTree)
File "D:\python2.7\entropy\treePlotter.py", line 39, in getNumLeafs
mumLeafs += getNumLeafs (secondDict[key])
UnboundLocalError: local variable 'mumLeafs' referenced before assignment
经过分析感觉应该是递归引用中涉及到了局部变量与全局变量的问题,于是将源程序进行了一下小的改动,加入了全局变量的申明:
def getNumLeafs(myTree):
global numLeafs
numLeafs = 0
firstStr = myTree.keys()[0]
secondDict = myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__ == "dict":
numLeafs += getNumLeafs (secondDict[key])
else:
numLeafs += 1
return numLeafs
运行后得到了正确的结果:
>>> myTree = retrieveTree(1)
>>> myTree
{'no surfacing': {0: 'no', 1: {'flippers': {0: {'head': {0: 'no', 1: 'yes'}}, 1: 'no'}}}}
>>> getNumLeafs(myTree)
4
>>>
我用的是Python2.7版本,不知道其他的版本是不是有这个毛病!