【问题标题】:Name 'function' is not defined名称 \'function\' 未定义
【发布时间】:2023-01-07 19:05:49
【问题描述】:

我有一个简单的 leetcode 问题需要解释。其他类似的 stackoverflow 问题并没有真正解决我的问题,我想知道这是否是我的代码有问题,或者是否需要以特定方式定义 leetcode 函数。这是我的代码:

class Solution:
    def countNegatives(self, grid: List[List[int]]) -> int:
        arr = []
        for g in grid:
            check(g)     
        return len(arr)
        
    def check(g):
        if g[-1] < 0:
            arr.append(g[-1])
            g.remove(g[-1])
            check(g)

我在第 5 行中收到错误,其中显示 check(g),因为它说的是 name 'check' is not defined

据我所知,check 应该在范围内,因为它没有在 countNegatives 函数内部定义。我调换了这两个函数的顺序,但这并不重要。我认为如果未定义 g 会更有意义,但它表示我的整个函数无效。函数中的实际代码是否正确目前对我来说并不重要,但我只是对为什么不定义它感到困惑。

【问题讨论】:

  • 检查在范围内,但它的定义方式 python 将其视为 Solution 实例的方法。您可能希望将其声明为 @staticmethod 并将其称为 Solution.check(g)。 (那么 arr 将是未定义的,你将遇到无限递归......)
  • 它没有定义。您将 check 定义为类属性,而不是全局(或非本地)函数。我会说它应该完全在类之外定义,但这看起来像是一些需要不必要类的非惯用框架,所以 check 可能应该定义为静态方法,然后在两个地方都用 self.check(g) 调用.
  • 感谢你们俩,这很有意义。我对 Python 中的类没有太多经验,有点习惯于在全局范围内随意定义函数。

标签: python arrays python-3.x function


【解决方案1】:

我认为这是缩进,检查是解决方案类的一部分,但它没有自我。因此,要么通过减少缩进将其从 Solution 类中移除:

class Solution:
    def countNegatives(self, grid: List[List[int]]) -> int:
        arr = []
        for g in grid:
            check(g)     
        return len(arr)
        
def check(g):
    if g[-1] < 0:
        arr.append(g[-1])
        g.remove(g[-1])
        check(g)

或者自己传递:

class Solution:
    def countNegatives(self, grid: List[List[int]]) -> int:
        arr = []
        for g in grid:
            check(g)     
        return len(arr)
        
    def check(self,g):
        if g[-1] < 0:
            arr.append(g[-1])
            g.remove(g[-1])
            check(g)

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2018-01-24
    • 2018-02-21
    • 2020-07-31
    相关资源
    最近更新 更多