提示:python实现类似像C语言里面的局部静态变量
前言
提示:python实现类似像C语言里面的局部静态变量:
在C语言函数里面,经常使用关键字static修饰变量计数,避免使用全局变量。我们在python实现类似像C语言里面的局部静态变量。
一、使用全局变量时
使用全局变量时有以下代码:
simState = 0
simCnt = 0
def simScan():
global simState
global simCnt
if simCnt > 0:
simCnt -= 1
if simState == 0:
if simCnt == 0:
print(simState)
simCnt = 5
simState = 1
elif simState == 1:
if simCnt == 0:
print(simState)
simCnt = 5
simState = 2
elif simState == 2:
if simCnt == 0:
print(simState)
simCnt = 5
simState = 0
# 模拟定时器每秒触发
import time
while True:
simScan()
time.sleep(1)
以上代码就是一直循环打印:
0
1
2
0
1
2
二、使用局部静态变量
将 simState 和 simCnt 替换成使用局部静态变量时为以下代码:
要想实现类似于C语言中的局部静态变量的效果。在Python中,没有直接的方式来实现类似的局部静态变量行为。不过,仍然可以通过其他方式来模拟局部静态变量的行为。一种可行的方式是使用函数属性来实现类似的效果。函数属性是指可以在函数对象上直接存储和访问的变量。
下面是使用函数属性实现局部静态变量的代码示例:
def simScan():
if not hasattr(simScan, 'simState'):
simScan.simState = 0
if not hasattr(simScan, 'simCnt'):
simScan.simCnt = 0
if simScan.simCnt > 0:
simScan.simCnt -= 1
if simScan.simState == 0:
if simScan.simCnt == 0:
print(simScan.simState)
simScan.simCnt = 5
simScan.simState = 1
elif simScan.simState == 1:
if simScan.simCnt == 0:
print(simScan.simState)
simScan.simCnt = 5
simScan.simState = 2
elif simScan.simState == 2:
if simScan.simCnt == 0:
print(simScan.simState)
simScan.simCnt = 5
simScan.simState = 0
# 模拟定时器每秒触发
import time
while True:
simScan()
time.sleep(1)
在上述代码中,我们使用 hasattr() 函数来检查函数对象 simScan 是否已经具有属性 simState 和 simCnt。如果属性不存在,则我们将其设置为初始值。
通过这种方式,每次调用 simScan() 函数时,函数属性 simState 和 simCnt 的值都会被保留,并在函数内部进行逻辑处理。这样,您就可以实现类似于局部静态变量的行为,而无需使用全局变量。
总结
以上两种方法输出结果相同。第二种方法避免了使用全局变量。