在 Python 函数中使用可变函数参数模仿类 C 的静态变量
Using mutable function arguments to imitate C-like static variables in Python functions
我想知道如何在 Python 中从 C 复制静态变量。我在 Python 中看到了很多与面向对象代码和可变默认参数的使用相关的帖子,但我只是想知道一个简单的过程示例。
这是我的 C 示例:
void static_variable(){
static int x = 0;
x++;
printf("%d\n", x);
}
这是我的 Python 示例:
def static_variable(counter=[0]):
counter[0] += 1
print(counter[0])
这两个示例都有效,但是,我想知道在 Python 中使用这种方法是否会带来一些固有的危险 - 或者当您不知道可变参数时它是否只是危险?
在python中,函数是first-class对象。这意味着它们可以具有属性。您可以简单地使用一个属性作为您的“静态变量”。避免了可变默认值的陷阱,代码也更加清晰:
def static_variable():
# define function attribute
if hasattr(static_variable, 'counter'):
static_variable.counter += 1
else:
static_variable.counter = 1
print(static_variable.counter)
static_variable()
static_variable()
static_variable()
结果:
1
2
3
我想知道如何在 Python 中从 C 复制静态变量。我在 Python 中看到了很多与面向对象代码和可变默认参数的使用相关的帖子,但我只是想知道一个简单的过程示例。
这是我的 C 示例:
void static_variable(){
static int x = 0;
x++;
printf("%d\n", x);
}
这是我的 Python 示例:
def static_variable(counter=[0]):
counter[0] += 1
print(counter[0])
这两个示例都有效,但是,我想知道在 Python 中使用这种方法是否会带来一些固有的危险 - 或者当您不知道可变参数时它是否只是危险?
在python中,函数是first-class对象。这意味着它们可以具有属性。您可以简单地使用一个属性作为您的“静态变量”。避免了可变默认值的陷阱,代码也更加清晰:
def static_variable():
# define function attribute
if hasattr(static_variable, 'counter'):
static_variable.counter += 1
else:
static_variable.counter = 1
print(static_variable.counter)
static_variable()
static_variable()
static_variable()
结果:
1
2
3