使用self.xxxx作为默认参数 – Python

嘿,你们都在努力简化我的作业问题,让代码变得更好一些。 我正在使用的是一个二叉search树。 现在我在我的Tree()类中有一个函数,它可以find所有的元素,并把它们放到一个列表中。

 tree = Tree() #insert a bunch of items into tree 

然后我使用我的makeList()函数从树中的所有节点,并把它们放在一个列表中。 要调用makeList()函数,我做了tree.makeList(tree.root) 。 对我来说这似乎有点重复。 我已经用tree.调用树对象了tree. 所以tree.root只是一个小打字的浪费。

现在makeList函数是:

  def makeList(self, aNode): if aNode is None: return [] return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) 

我想使aNodeinput一个默认的参数,如aNode = self.root (这是行不通的),我可以运行这个函数, tree.makeList()

第一个问题是,为什么不这样做?
第二个问题是,有没有办法可以工作? 正如你所看到的makeList()函数是recursion的,所以我不能在函数的开头定义任何东西,或者我得到一个无限循环。

编辑这里是所有要求的代码:

 class Node(object): def __init__(self, data): self.data = data self.lChild = None self.rChild = None class Tree(object): def __init__(self): self.root = None def __str__(self): current = self.root def isEmpty(self): if self.root == None: return True else: return False def insert (self, item): newNode = Node (item) current = self.root parent = self.root if self.root == None: self.root = newNode else: while current != None: parent = current if item < current.data: current = current.lChild else: current = current.rChild if item < parent.data: parent.lChild = newNode else: parent.rChild = newNode def inOrder(self, aNode): if aNode != None: self.inOrder(aNode.lChild) print aNode.data self.inOrder(aNode.rChild) def makeList(self, aNode): if aNode is None: return [] return [aNode.data] + self.makeList(aNode.lChild) + self.makeList(aNode.rChild) def isSimilar(self, n, m): nList = self.makeList(n.root) mList = self.makeList(m.root) print mList == nList 

莱曼斯回答你的第一个问题

对于你的第二个问题,你可以简单地看一下你跳跃之前,以避免recursion?

 def makeList(self, aNode=None): if aNode is None: aNode = self.root treeaslist = [aNode.data] if aNode.lChild: treeaslist.extend(self.makeList(aNode.lChild)) if aNode.rChild: treeaslist.extend(self.makeList(aNode.rChild)) return treeaslist 

它不起作用,因为默认参数是在函数定义时评估的,而不是在调用时间:

 def f(lst = []): lst.append(1) return lst print(f()) # prints [1] print(f()) # prints [1, 1] 

常用的策略是使用None默认参数。 如果None是一个有效值,则使用单身标记:

 NOTHING = object() def f(arg = NOTHING): if arg is NOTHING: # no argument # etc.