【问题标题】:how to make a variable static in python如何在python中使变量静态
【发布时间】:2013-06-07 17:11:45
【问题描述】:

我刚开始学习编程,所以当我想在 python 中使用递归编写数字求和代码时。我遇到了这个问题,在这里我怎样才能将 add = 0 设为静态,有人可以帮忙,因为我的 ans 是 0

def sum(n):  
    add = 0
    if n > 0: 
        add = add + n
        sumf (n-1)
        print add

sum(10) 

【问题讨论】:

  • “将add = 0设为静态”是什么意思?
  • 即使在具有静态变量的语言中也无法正常工作。结果将是sum(5) -> 15,sum(3) -> 21,应该是 6。静态变量只会在程序中初始化一次,而不是每次计算新的(非递归)总和时。跨度>
  • 顺便说一句,重命名 sum() 等内置函数是一个坏习惯,会导致未来的痛苦。

标签: python


【解决方案1】:

我想我明白你在问什么。您可以尝试在 python 中模拟这样的静态变量:

def test():
    test.static_variable += 1
    print test.static_variable

test.static_variable = 0
test()

【讨论】:

    【解决方案2】:

    如果我正确阅读了您的问题,那么您并没有真正解决这里的递归问题。你需要这样做:

    def sum(n):
        if n == 0:
            return n
    
        return n + sum(n - 1)
    

    sum(n - 1) 将返回 (n - 1) + sum(n - 2),因此 sum(n) 最终返回 n + (n - 1) + sum(n - 2)。它将继续扩展,直到 n0,此时,您将获得从 0n 的所有数字的总和。

    【讨论】:

    • mySum = lambda n: n if n is 0 else n + mySum(n-1)
    • @dansalmo:或者只是sum = lambda n: n * (n + 1) / 2
    • :),是的,但这不是递归的。
    【解决方案3】:

    您可以使用全局变量,但这通常是不好的做法。相反,把它写成一个类。这样您就可以将变量 add 与需要它的代码“捆绑”在一起。

    class Sum(object):
        def __init__(self, add=0):
            self.add = add
        def __call__(self, n):
            if n > 0:
                self.add += n
                sumf(n-1)
                print self.add
    
    sum = Sum()   # create an instance
    sum(10)       # 10
    sum(10)       # 20
    

    【讨论】:

      【解决方案4】:

      除了python没有静态变量之外,递归不要使用静态值,使用返回值。或者,如果您确实想在调用之间保持状态,请使用类。

      【讨论】:

        【解决方案5】:

        遗憾的是,在 Python 中,没有静态变量这样的东西。但是,您可以尝试通过在函数范围之外定义 add 来模拟这一点(在一定程度上)。此外,您的第 5 行为sumf (n-1);这是故意的吗?

        【讨论】:

          【解决方案6】:

          Python 实际上没有实用的静态变量;更多信息可通过here 获得。 Python 也不支持通过引用传递数字。

          【讨论】:

            【解决方案7】:

            这是递归执行此操作的正确方法:

            def sum(n):
                if (n > 0):
                    return n + sum(n-1)
                else:
                    return 0
            

            【讨论】:

              【解决方案8】:

              您可以为函数添加属性并使用hasattr() 进行初始化。

              def func(n):  
                  if not hasattr(func, "add"):
                      func.add = 0
              
                  func.add = func.add + n
                  print func.add
              
              func(10) # print 10
              func(5)  # print 15
              func(20) # print 35
              

              【讨论】:

                【解决方案9】:

                您正在尝试使用 static 变量作为 accumulator 变量 -- 就像有时在 C 中所做的那样。

                如果你真的想做这样的事情,你可以在递归调用你的函数时传递累加器。并且函数应该返回 accumulated 值。

                >>> def my_recursive_fct(n, acc = 0):
                ...     if n > 0:
                ...         acc = my_recursive_fct(n-1, acc)
                ...     return acc+n
                ... 
                >>> my_recursive_fct(5)
                15
                >>> my_recursive_fct(0)
                0
                

                不确定这是最好的 Python 风格。至少在那种情况下;)

                对于纯粹主义者,您可能希望重新排序指令以通过递归调用结束您的函数——但我认为这在 Python 中毫无意义,因为它不执行 tail call 优化(或者我错了吗?)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2021-11-17
                  • 1970-01-01
                  • 2014-12-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-18
                  • 1970-01-01
                  相关资源
                  最近更新 更多