デフォルトパラメータとしてself.xxxxを使う - Python



0 Answers

デフォルトの引数は呼び出し時ではなく関数定義時に評価されるため、動作しません。

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.
Question

ちょっとy'all、私は私の宿題の問題の一つを簡素化し、コードを少し良くしようとしています。 私が作業しているのはバイナリ検索ツリーです。 今、私はすべての要素を見つけてそれらをリストに入れるTree()クラスの関数を持っています。

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

次に私はmakeList()関数を使って木からすべてのノードを取り出し、リストに入れます。 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)

私はaNode入力をaNode = self.root (これは動作しません)のようなデフォルトのパラメータにして、 tree.makeList()関数を実行できるようにしたいと思います。

最初の質問は、なぜそれは働かないのですか?
2番目の質問は、それが働くことができる方法はありますか? あなたが見ることができるように、関数の初めに何も定義することはできませんので、 makeList()関数は再帰的です。無限ループになります。

EDITここではすべてのコードを要求しています:

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 



Related