1

我正在尝试设置一个函数来做这样的事情

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

当前节点以root身份开始,然后我们将其更改为方法中的不同节点并再次递归调用它。

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

编辑:这种方法的基本情况已经

if currentNode == None:

所以用它来设置根是行不通的

4

4 回答 4

2

虽然arg=None是未提供参数的惯用 Python 哨兵值,但它不必None. 例如,在 Lua 中,惯用的 non-supplied 参数是一个空表。我们实际上可以将其应用于这种情况:

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({})

输出:

争论是 123
你没有提供论据!
争论是无
参数是 {}

这适用于除了显式传递之外的任何情况Foo.sentinel,因为Foo.sentinel保证有一个唯一的地址——意思是,只有当 x 是时才为真x is Foo.sentinel:)因此 Foo.sentinel由于我们在 周围创建了闭包Foo.sentinel,只有一个对象可以创建一个模棱两可的情况,绝不会误用。

于 2010-03-14T18:57:18.003 回答
0

你可以做

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

...
于 2010-03-14T18:44:49.733 回答
0

定义函数或方法时,def会立即评估该行,包括任何关键字参数。出于这个原因,函数调用和可变对象之类的东西通常不适合默认参数。

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

not_provided = object()
def _binaryTreeInsert(self, toInsert, currentNode=not_provided, parentNode=None):
    if currentNode is not_provided:
        currentNode = self.getRoot()
于 2010-03-14T19:00:57.917 回答
-1
def __binaryTreeInsert(self, toInsert, currentNode=0, parentNode=None):
    if not currentNode: 
        currentNode = self.getRoot()
于 2010-03-14T18:46:04.843 回答