今天在學習“機器人學習實戰”這本書的第三章時,擷取分葉節點的數目和書的層數。按照書上的原始碼編碼運行後出現錯誤:
原始碼:
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版本,不知道其他的版本是不是有這個毛病。