将自数据传递到递归函数

2024-05-03 23:46:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试设置一个函数来执行类似的操作

   def __binaryTreeInsert(self, toInsert, currentNode=getRoot(), parentNode=None):

其中current node以root开始,然后我们将其更改为方法中的另一个节点,并递归地再次调用它。在

但是,我不能让'currentNode=getRoot()'工作。如果我尝试调用函数getRoot()(如上所述),它会说我没有给它所有必需的变量,但是如果我尝试调用self.getRoot()它抱怨self是一个未定义的变量。有没有一种方法可以在调用此方法时不必指定根目录就可以做到这一点?在

编辑:此方法的基本情况已经存在

^{pr2}$

所以用这个来确定根是行不通的


Tags: 方法函数selfnonenode节点defroot
3条回答

你能做到的

def __binaryTreeInsert(self, toInsert, currentNode=None, parentNode=None):
   if currentNode is None:
      currentNode = self.getRoot()

...

虽然arg=None是未提供参数的惯用Python sentinel值,但它没有成为None。例如,在Lua中,惯用的未提供参数是一个空表。我们可以将其应用于本案:

class Foo:
    sentinel = {}
    def bar(self, arg=sentinel):
        if arg is self.sentinel:
            print "You didn't supply an argument!"
        else:
            print "The argument was", arg

f = Foo()
f.bar(123)
f.bar()
f.bar(None)
f.bar({})

输出:

^{pr2}$

这适用于除显式传递Foo.sentinel之外的任何情况,因为Foo.sentinel被保证有一个唯一的地址——这意味着,x is Foo.sentinel在x时才是真的:)因此,由于我们围绕Foo.sentinel创建了闭包,因此只有一个对象可以创建一个不明确的情况,它绝不会被偶然使用。在

定义函数或方法时,def行立即求值,包括任何关键字参数。因此,函数调用和可变对象之类的东西通常不适合作为默认参数。在

解决方案是使用sentinel值。None是最常见的,但是对于None是有效值的情况,您可以使用另一个sentinel,例如:

not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
    if currentNode is not_provided:
        currentNode = self.getRoot()

相关问题 更多 >