【问题标题】:What does a function followed by (dot) then variable [func.var] means in python? [duplicate]函数后跟(点)然后变量 [func.var] 在 python 中是什么意思? [复制]
【发布时间】:2019-05-28 03:43:50
【问题描述】:

以下代码来自Geeks for Geeks,用于计算二叉树中的最大路径和。

在函数findMaxSum() 中,他们将变量声明为findMaxUtil.res 这是什么意思?

我看到this question on SOF 如果function.variable 在函数内部,则表示该函数是一种对象。但在此示例中,函数名称和变量超出了原始函数。有人会用一个清晰​​的例子来解释一下吗!

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

def findMaxUtil(root): 
    if root is None: 
        return 0 

    l = findMaxUtil(root.left) 
    r = findMaxUtil(root.right) 

    max_single = max(max(l, r) + root.data, root.data) 
    max_top = max(max_single, l+r+ root.data) 
    findMaxUtil.res = max(findMaxUtil.res, max_top)  

    return max_single 

def findMaxSum(root): 

    findMaxUtil.res = float("-inf")  ## This line
    findMaxUtil(root) 
    return findMaxUtil.res           ## and this line

【问题讨论】:

  • 这是一个糟糕的方法——他们基本上只是使用一个全局变量。他们可以在没有任何全局状态的情况下轻松编写此代码。
  • OTOH,使用附加到函数的全局变量比使用污染模块范围的全局变量更好。所以这是一种不好的方法,但它比采用这种坏方法的更明显的方法要好。
  • ...顺便说一句,我认为如果他们将其称为global_max 而不是res,读者可能会更清楚。

标签: python python-3.x


【解决方案1】:

函数是对象。它们可以像任何其他对象一样具有属性;没有特殊的语法级别含义。

据推测,这种情况下的意图是拥有一些其他语言所称的“静态”变量——一个对函数本身全局存在的变量,而不是针对单个调用的范围。


证明即使是微不足道的 noop 函数也可以挂起变量:

def example():
    pass

example.foo = "hello"

print(example.foo) # prints "hello"

【讨论】:

  • 非常感谢。但是我注意到如果我删除变量res 之前的函数名,代码将无法工作。在这种情况下,如何解决这个问题并使其与正常的全局变量一起使用?
  • 如果在模块范围内设置了res = 0,那么在函数第一次引用res 之前将global res 放入函数中将确保它使用全局。但是不要那样做——全局范围是一种有限的资源,应该在合理的地方加以保护。 (这符合 Python 之禅的“命名空间是一个伟大的想法”的一部分——您将函数对象用作关联全局的命名空间)。
  • 所以最好的办法就是保持原样,对吗?再次感谢
  • 好吧,不,最好的方法是根本不使用全局变量,f/e,将函数变成一个真正的类并引用self.result 或类似的.效果相同,但读者不那么惊讶。
猜你喜欢
  • 2022-11-04
  • 2012-04-29
  • 2018-05-15
  • 1970-01-01
  • 2012-03-17
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多