功能明显差异的解释

2024-05-07 23:42:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python代码中调用某个函数(tree\u insert)的方式感到困惑。在我看来,它的签名在调用中被破坏了。有人能澄清一下吗?具体来说,tree\u insert有参数self和data。但是,在调用中,第一个参数是数据,第二个参数是自左. 似乎有一个不一致,但代码工作。你知道吗

Python not defined recursive function?

class BinaryTree():
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

    def tree_insert(self, data):
        if (data < self.data):
            if (self.left != None):
                self.tree_insert(data, self.left)
            else:
                self.left = BinaryTree(data)
        else:
            if (self.right != None):
                self.tree_insert(data, self.right)
            else:
                self.right = BinaryTree(data)

尽管调用方式明显不正确,但函数仍能正常工作。这里有一些Python的特殊性。。你知道吗


Tags: 函数代码selfrightnonetreedata参数
1条回答
网友
1楼 · 发布于 2024-05-07 23:42:04

在那个(6x)的代码上,投票,并接受答案根本不工作。运行时会生成错误:

TypeError: tree_insert() takes 2 positional arguments but 3 were given

正如你所发现的,这个电话毫无意义:

self.tree_insert(data, self.left)

应该是:

self.left.tree_insert(data)

下面是更正的代码:

class BinaryTree():
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

    def tree_insert(self, data):
        if data < self.data:
            if self.left:
                self.left.tree_insert(data)
            else:
                self.left = BinaryTree(data)
        else:
            if self.right:
                self.right.tree_insert(data)
            else:
                self.right = BinaryTree(data)

一些测试代码:

if __name__ == "__main__":
    from random import sample

    data = sample(range(-10, 11), 21)

    tree = BinaryTree(data.pop())

    for item in data:
        tree.tree_insert(item)

如果我们借用display()code from this answer,我们会得到如下的二叉树:

> python3 test.py
                      __3_____   
                     /        \  
           __________0      __9_ 
          /           \    /    \
  _______-6_____      1    6_  10
 /              \      \  /  \   
-10___       __-3___   2  5  8   
      \     /       \    /  /    
     -8_   -5_     -1    4  7    
    /   \     \   /              
   -9  -7    -4  -2              
> 

相关问题 更多 >