Python OOP and lists
我对python不熟悉,它是OOP的东西,不能让它工作。以下是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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]的内容,但是当我
1 | tree.appendLeft(tree2) |
我得到了
谢谢你
问题是,您已经将
另外,去掉所有的分号。它们是不必要的,会使代码混乱。
将根和数据移动到EDOCX1的定义中(2)。现在,您已经将它们定义为类属性。这使得它们在树类的所有实例之间共享。当您实例化两个树(
1 2 3 | def __init__(self, equation): self.root = equation self.data = [] |
此外,使用
1 | if isinstance(item,Tree): # This is True if item is a subclass of Tree |
而不是
1 | if (type(item) == type(self)): # This is False if item is a subclass of Tree |
变化
1 | data = self.data |
到
1 | data = self.data[:] |
在
1 2 3 4 | def getRight(self): data = self.data[:] data.reverse() return data |
当您以以下方式定义属性时:
1 2 3 | class Tree: root = None data = [] |
..这个空列表对象是按照python定义类的方式创建的,而不是在创建新实例时创建的。它是类属性,而不是实例属性。也就是说,
1 2 3 4 5 6 7 8 | class Tree: root = None data = [] t1 = Tree() t2 = Tree() print id(t1.data) == id(t2.data) # is True, they are the same object |
要获得预期的行为,请将创建空列表的操作移动到
1 2 3 4 5 6 7 8 9 | 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 |
这个问题解释了为什么这种行为是有用的