5

私はPythonを初めて使用しますが、これはOOPのものであり、動作させることができません。これが私のコードです:

class Tree:

    root = None;
    data = [];

    def __init__(self, equation):
        self.root = equation;

    def appendLeft(self, data):
        self.data.insert(0, data);

    def appendRight(self, data):
        self.data.append(data);

    def calculateLeft(self):
        result = [];
        for item in (self.getLeft()):
            if (type(item) == type(self)):
                data = item.calculateLeft();
            else:
                data = item;
            result.append(item);
        return result;

    def getLeft(self):
        return self.data;

    def getRight(self):
        data = self.data;
        data.reverse();
        return data;

tree2 = Tree("*");
tree2.appendRight(44);
tree2.appendLeft(20);

tree = Tree("+");
tree.appendRight(4);
tree.appendLeft(10);
tree.appendLeft(tree2);

print(tree.calculateLeft());

tree2とtreeがリスト「データ」を共有しているようです。

現時点では、[[20,44]、10、4]のようなものを出力したいのですが、

tree.appendLeft(tree2) 

私は得ますRuntimeError: maximum recursion depth exceeded、そして私がappendLeft(tree2)それさえ出力しないとき[10, 20, 44, 4](!!!)。ここで何が欠けていますか?PortablePython3.0.1を使用しています。

ありがとうございました

4

3 に答える 3

10

data問題は、クラス変数として宣言しているため、クラスのすべてのインスタンスが同じリストを共有していることです。代わりに、を入れself.data = []てください__init__

また、これらのセミコロンをすべて削除します。それらは不要であり、コードを乱雑にします。

于 2010-05-20T23:14:08.617 に答える
4

ルートとデータをの定義に移動します__init__。現状では、それらはクラス属性として定義されています。これにより、Treeクラスのすべてのインスタンス間で共有されます。2つのツリー(treeおよびtree2)をインスタンス化すると、両方とも。でアクセスされる同じリストを共有しますself.data。各インスタンスに独自のインスタンス属性を持たせるには、宣言を__init__関数に移動する必要があります。

def __init__(self, equation):
    self.root = equation
    self.data = []

また、使用

        if isinstance(item,Tree):        # This is True if item is a subclass of Tree

それ以外の

        if (type(item) == type(self)):   # This is False if item is a subclass of Tree

と変更

data = self.data

data = self.data[:]

getRight。あなたが言うときdata = self.data、変数名はdataを指すのとまったく同じリストをself.data指します。その後逆転するdataと、同様に逆転self.dataします。のみを元に戻すdataには、リストをコピーする必要があります。self.data[:]スライス表記を使用して、リストのコピーを返します。の要素はsにすることができ、同じ要素を含めることがself.dataできることに注意してください。コードでこれらの要素をコピーする必要はないと思いますが、その場合は再帰的にコピーする必要があります。Treeself.dataself.data[:]self.data

def getRight(self):
    data = self.data[:]
    data.reverse()
    return data
于 2010-05-20T23:15:00.063 に答える
3

次の方法で属性を定義する場合:

class Tree:
    root = None
    data = []

..その空のリストオブジェクトは、新しいインスタンスを作成するときではなく、Pythonがクラスを定義するときに作成されます。これはクラス属性であり、インスタンス属性ではありません。つまり、Tree.rootすべてのインスタンスで同じオブジェクトです。

class Tree:
    root = None
    data = []

t1 = Tree()
t2 = Tree()

print id(t1.data) == id(t2.data) # is True, they are the same object

期待する動作を得るには、空のリストの作成を__init__関数に移動します。この関数は、新しいインスタンスを作成するときにのみ呼び出され、そのインスタンスのみを変更します(に割り当てられますself)。

class Tree:
    def __init__(self):
        self.root = None
        self.data = []

t1 = Tree()
t2 = Tree()

print id(t1.data) == id(t2.data) # False, they are different objects

この質問は、なぜそのような振る舞いが役立つのかを説明しています

于 2010-05-21T10:51:16.057 に答える