小能豆

Python 中函数内部静态变量的对应内容是什么?

python

这段 C/C++ 代码的惯用 Python 对应代码是什么?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %d\n", counter);
}

具体来说,如何在函数级别而不是类级别实现静态成员?将函数放入类中会有什么变化吗?


阅读 150

收藏
2024-06-27

共1个答案

小能豆

在 Python 中,函数级别的静态变量概念与 C/C++ 中类似,但并不存在相同的方式。但是,您可以使用默认可变参数、函数属性或在类内定义函数来实现类似的功能。

使用函数属性

在 Python 中实现类静态变量的一种惯用方法是使用函数属性。具体操作如下:

def foo():
    if not hasattr(foo, "counter"):
        foo.counter = 0  # it will be initialized only once
    foo.counter += 1
    print(f"counter is {foo.counter}")

# Testing the function
foo()  # counter is 1
foo()  # counter is 2
foo()  # counter is 3

在这个例子中,foo.counter它就像一个静态变量,在函数调用之间保留其值。

使用默认可变参数

模拟静态变量的另一种方法是使用默认可变参数。此方法利用了这样一个事实:默认参数值仅在定义函数时求值一次,而不是每次调用函数时都求值。

def foo(counter=[0]):
    counter[0] += 1
    print(f"counter is {counter[0]}")

# Testing the function
foo()  # counter is 1
foo()  # counter is 2
foo()  # counter is 3

这里counter是一个只有一个元素的列表,并且它的值在函数调用之间保持不变。

使用类

将函数放在类中是实现此目的的另一种方法。如果函数是共享状态的相关函数的较大集合的一部分,则此方法会很有用。

class Foo:
    counter = 0

    @classmethod
    def foo(cls):
        cls.counter += 1
        print(f"counter is {cls.counter}")

# Testing the function
Foo.foo()  # counter is 1
Foo.foo()  # counter is 2
Foo.foo()  # counter is 3

在这个例子中,counter是一个类变量,它在类的所有实例中以及函数调用之间保留其值。

概括

  • 函数属性:用于hasattr检查函数中是否存在属性,如果不存在则初始化它。
  • 默认可变参数:使用可变的默认参数来维护函数调用之间的状态。
  • 类和类方法:使用类将函数和共享状态封装为类变量。
2024-06-27