Python - 为什么我不能将该属性作为参数传递给类中的另一个方法?

时间:2015-07-27 02:37:56

标签: python class

class Node:
    """A Tree Node with 3 attributes: l_child, r_child and data"""
    def __init__(self, val):
        self.data = val
        self.l_child = None
        self.r_child = None

class BST(object):
    """Implement a Binary Search Tree class"""
    def __init__(self):
        self.root = None
        print "Initial root", self.root

    def insertRecur(self, node, data):
        if node is None:
            node = Node(data)
        else:   
            if data < node.data:
                insertRecur(node.l_child, data)
            if data > node.data:
                insertRecur(node.r_child, data)

    def Insert(self, data):
        self.insertRecur(self.root, data)

对不起,伙计们 这实际上是我的原始代码。我想使用Python来实现二叉搜索树类。我想这样做

test = BST()
test.Insert(1)
print test.root

和test.root是None

3 个答案:

答案 0 :(得分:2)

当然它仍然是None。你没有给它赋值。应该是。

def Insert(self, data):
    self.data = data
    self.Recur(self.data, data)

然而,功能

def Recur(self, node, data):
    if node is None:
        node = data

绝对没有(并且从未做过),因为node未在任何地方使用,仅被分配到。

编辑:在您更新了代码后,我们可以看到您尝试做的事情。您test.root None的原因是因为您从未分配它。问题出在这里:

def insertRecur(self, node, data):
    if node is None:
        node = Node(data)

self.insertRecur(self.root, data)调用此函数时,它指向与self.root None相同的值。node = Node(data)。执行node后,您要重新分配Note(data)以指向self.root,这不会重新分配class Node: """A Tree Node with 3 attributes: l_child, r_child and data""" def __init__(self): self.data = None self.l_child = None self.r_child = None class BST(object): """Implement a Binary Search Tree class""" def __init__(self): self.root = Node() print "Initial root", self.root def insertRecur(self, node, data): if node.data is None: node.data = data elif data < node.data: node.l_child = node.l_child or Node() self.insertRecur(node.l_child, data) else: node.r_child = node.r_child or Node() self.insertRecur(node.r_child, data) def Insert(self, data): self.insertRecur(self.root, data) 。这样做:

web = (WebView)findViewById(R.id.web_vieww);
web.loadUrl("http://www.google.co.in/");
web.setWebViewClient(new MyWebViewClient());

Define MyWebViewClient();

private class MyWebViewClient extends WebViewClient {

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        return false;
    }
}

答案 1 :(得分:0)

您只需将self.data的值分配给node,而不是variable self.data本身。你在Insert函数中调用的是:

self.Recur(None, 5)

我想你想要的是:

self.Recur(*self.data, 5)

但是python中没有pointer。您可以将Recur的代码合并到Insert,或者如果您想同时维护RecurInsert

    def Recur(self, node, data):
        if node is None:
            node = data
        return node

    def Insert(self, data):
        self.data = self.Recur(self.data, data)

答案 2 :(得分:0)

您的示例在某些编程语言中工作。 (例如 C允许这个,通过指针引用。)它在这里不起作用的原因是因为在Python中定义了方法调用的语义。

Python中的名称绑定

写作时

self.data = None

这会为对象self.data指定一个新名称(None)。

self.Recur定义为

def Recur(self, node, data):
    if node is None:
        node = data

以下在None方法的上下文中为Recur提供了一个新名称: node

self.Recur(self.data, data)

但是,同一对象的内部作用域中的这个新名称(node)与外部作用域中的另一个名称(self.data)没有相关性。

写作时

node = data

这会将名称node分配给一个新值,即值 名称data指的是。同样,这不会影响名称 self.data。有关详细信息,请查看此blog post

如何做你想做的事

另一方面,如果您希望Recur能够为test对象的任何属性赋值,则可以完成。这里 是实现它的一种方式:

class test:
    def __init__(self):
        self.data = None

    def Recur(self, nodeName, data):
        if self[nodeName] is None:
            self[nodeName] = data;

    def Insert(self, data):
        self.Recur("data", data) 

    __getitem__ = self.__getattr__
    __setitem__ = self.__setattr__

注意:此代码未经测试

这允许Insert选择"data"分配值的名称(Recur)。 Recur就其本身而言,使用Python的dict-key get-item语法为我们的准dict对象中的键data赋值;但是,我们将get-item和set-item语义设置为与最后两行的get-attribute和set-attribute语义相同 - 这确保self["name"]self.name的含义相同}。一个不太神秘的实现将是:

def __getitem__(self, key):
    return self.__getattr__(key)