为什么调用函数会导致NameError?

2024-04-20 00:21:28 发布

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

我正在写下面的代码,但是当我试图调用函数size()时,它抛出了错误

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

    def insert(self,data):
            if self.data:
                if data<self.data:
                    if self.left is None:
                        self.left=Node(data)
                    else:
                        self.left.insert(data)
                else:
                    if self.right is None:
                        self.right=Node(data)
                    else:
                        self.right.insert(data)
            else:
                self.data=data

    def size(node):
        if node is None:
            return 0 
        else:
            return (size(node.left)+ 1 + size(node.right)) 

root=Node(4)

root.insert(5)
root.insert(3)
root.insert(8)

print(size(root))

引发以下错误:

NameError                                 Traceback (most recent call last)
<ipython-input-7-8c72ba7719dc> in <module>
     41 root.insert(8)
     42 
---> 43 print(size(root))
     44 
     45 #root.print()

NameError: name 'size' is not defined

Tags: selfrightnonenodedatasizeifis
3条回答

class语句之后定义size

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

    def insert(self,data):
        ...


def size(node):
    if node is None:
        return 0
    else:
        return (size(node.left)+ 1 + size(node.right)) 

或者用适当的方法:

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

    def insert(self,data):
        ...

    def size(self):
        rv = 1
        if self.left is not None:
            rv += self.left.size()
        if self.right is not None:
            rv += self.right.size()
        return rv

经过与@ShadowRanger的讨论,我得出了以下结论。你知道吗

from __future__ import annotations

from dataclasses import dataclass
from typing import Any


@dataclass
class Node:
    data: Any
    left: Node = None
    right: Node = None

    def insert(self, data: Any) -> None:
        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            else:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

    def num_child_nodes(self) -> int:
        num_nodes = 0
        if self.left:
            num_nodes += 1 + self.left.num_child_nodes()
        if self.right:
            num_nodes += 1 + self.right.num_child_nodes()
        return num_nodes

在代码中,size是绑定到Node对象的方法,因此需要调用root.size()(因为rootNode实例)

相关问题 更多 >