【问题标题】:Python Self Not Defined in Default Argument for Tree Traversal树遍历的默认参数中未定义 Python Self
【发布时间】:2018-08-14 15:46:46
【问题描述】:

我已阅读 this answer 关于在 Python 方法的 defaultis 参数中使用 self 的问题,但似乎无法使其适用于我的用例,这是对树遍历的递归调用,如图所示下面:

def in_order_traversal(self, node):
    if node != None:
        print(node, end=" ")
        self.in_order_traversal(node.left)
        self.in_order_traversal(node.right)

我必须用tree.in_order_traversal(tree.root) 调用它,但宁愿只使用tree.in_order_traversal(),并将node=self.root 作为方法定义中的第二个参数。

有人可以建议如何使用链接到的答案中给出的“解决方法”吗?

【问题讨论】:

  • 你能展示全班吗?
  • 您似乎没有尝试让它发挥作用。您没有 node 参数的默认 None 值,或处理 node is None 情况。

标签: python parameter-passing


【解决方案1】:

你的问题并不清楚,但我认为你的问题是你已经在使用None 来表示“这是一片叶子,没有什么可打印的”,所以你不能也 使用None 作为同一参数中的默认值,表示“使用您的默认值”。

解决这个问题的方法是定义一个“哨兵”对象,它不是None,也不同于任何可能的实际值。例如:

_sentinel = object()
def in_order_traversal(self, node=_sentinel):
    if node is self._sentinel:
        node = self.root
    if node != None:
        print(node, end=" ")
        self.in_order_traversal(node.left)
        self.in_order_traversal(node.right)

【讨论】:

  • 这就是问题所在,尽管in_order_traversal 是一个类方法,我在哪里可以定义_sentinel 而不会遇到同样的问题?即def in_order_traversal(self, node=self._sentinel):
  • @Robin 如果是类方法,则应使用@classmethod 修饰,并以cls 而不是self 作为第一个参数。如果它是一个实例方法——就像你发布的那样——那么只需完全按照我在答案中发布的内容进行操作。你不能使用self._sentinel作为默认值,就像你可以使用'self.root, but you can use _sentinel`一样,它在类定义命名空间的范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多