我试图破译几年前发布的代码: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来自哪里?
答案 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
类的所有属性。他们只是使用不同的别名。这可以通过打印出root
和node
参数的类型直接观察到:
在您的功能开始时,我们可以打印root
和node
的类型:
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'>