如何在python中创建一个变量static

时间:2013-06-07 17:11:46

标签: python

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

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

sum(10) 

9 个答案:

答案 0 :(得分:2)

你可以使用全局,但这通常是不好的做法。相反,将其写为一个类。这样,您可以将变量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

答案 1 :(得分:2)

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

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

test.static_variable = 0
test()

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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的所有数字的总和。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您可以向函数添加属性并使用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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

您尝试将静态变量用作累加器变量 - 因为它有时在C中完成。

如果你真的想做类似的事情,你可以在递归调用你的函数时传递累加器。该函数应返回累积的值。

>>> 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优化(或者我错了吗?)