当自变量传递给新函数时,会发生什么变化?

时间:2016-11-17 17:17:58

标签: python function arguments

我试图破译几年前发布的代码:How to implement a binary search tree in Python?

我感到困惑的部分是这一部分:

class Node:
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.data = val

def binary_insert(root, node):
    if root is None:
        root = node
    else:
        if root.data > node.data:
            if root.l_child is None:
                root.l_child = node
            else:
                binary_insert(root.l_child, node)
        else:
            if root.r_child is None:
                root.r_child = node
            else:
                binary_insert(root.r_child, node)

然后通过执行以下操作调用类和函数:

r = Node(3)
binary_insert(r, Node(7))
binary_insert(r, Node(1))
binary_insert(r, Node(5))

我的问题是:传递给binary_insert函数时self.data发生了什么? node.data和root.data来自哪里?

2 个答案:

答案 0 :(得分:0)

这些正是self.data发生的事情。 root.data访问data root的{​​{1}}属性,该属性是Node类的实例。

答案 1 :(得分:0)

Python使用self作为类引用其自身属性的方法。一旦调用该实例的方法,Python就会用你的类实例隐式填充self。

  

传递给binary_insert函数时self.data发生了什么?

无。 Node对象的实例已传递到binary_searach函数。传递给函数的Node对象仍具有Node对象的所有属性,包括self.data

  

node.data和root.data来自哪里?

如您所见,您的函数将Node对象的两个实例作为其参数。传递给函数的两个节点对象仍具有原始Node类的所有属性。他们只是使用不同的别名。这可以通过打印出rootnode参数的类型直接观察到:

在您的功能开始时,我们可以打印rootnode的类型:

def binary_insert(root, node):
    print("The type of root is:", type(root))
    print("The type of node is:", type(node))
    ...

当称为输出时:

The type of root is: <class 'Node'>
The type of node is: <class 'Node'>
The type of root is: <class 'Node'>
The type of node is: <class 'Node'>
The type of root is: <class 'Node'>
The type of node is: <class 'Node'>
The type of root is: <class 'Node'>
The type of node is: <class 'Node'>