我有一个经常循环的函数。 在它里面,我想创建一个变量,然后将不断增加。 我的问题是,当我在函数中定义它时,它会被新的迭代覆盖,从而使它的使用无效
所以我只想定义它一次,不管它循环的频率有多高。但也许还有另一种解决办法
我的代码和变量是aniTimer
:
def animate(self, sprite_array, animation_length_in_s, pos):
aniTimer = ? #How do I define it only once?
ani_len = animation_length_in_s
sprite_len = len(sprite_array) -1
if time.time() >= aniTimer + ani_len:
self.aniCount += 1
aniTimer = time.time()
if self.aniCount > sprite_len:
self.aniCount = 0
我试过这个:
def animate(self, sprite_array, animation_length_in_s, pos):
try:
aniTimer
except NameError:
aniTime = time.time()
ani_len = animation_length_in_s
sprite_len = len(sprite_array) -1
if time.time() >= aniTimer + ani_len:
self.aniCount += 1
aniTimer = time.time()
if self.aniCount > sprite_len:
self.aniCount = 0
我试过这个:
def animate(self, sprite_array, animation_length_in_s, pos):
if "aniTimer" not in locals():
aniTime = time.time()
ani_len = animation_length_in_s
sprite_len = len(sprite_array) -1
if time.time() >= aniTimer + ani_len:
self.aniCount += 1
aniTimer = time.time()
if self.aniCount > sprite_len:
self.aniCount = 0
但两种尝试都会执行。这也让我想到了为什么会发生这种情况的问题。NameError
应该只存在一次,定义变量后,它应该位于locals()
此外,全局定义变量会导致错误,即在定义局部变量之前先引用它。 并将其定义为utillity函数中的全局变量
MRE
这是一个MRE,有着几乎相同的问题,但是变量timer
。这个函数将被许多对象调用,所以计时器需要为调用它的每个对象都有一个单独的值
timer = 0
breaks = 3
looping = True
def test():
while looping:
timer += 1
print(timer)
if timer >= breaks:
print("Print this")
break
test()
如果要使用全局变量,可以在函数顶部使用
global aniTime
在函数中使用它最佳实践可能是将变量保存在调用函数的循环之外,并且可以将其作为参数传递到函数中
尝试在任何函数之外定义变量,将其调用到函数中,然后在每次使用后从函数返回
这将使每次运行“示例”函数时,“var”都被传递到其中,然后返回,增加1。每次在程序运行时使用此函数时,变量“var”将增加1
在这种情况下,您可以将我用作“aniTime”变量示例的“var”变量替换为“aniTime”,您只需在函数之前定义一次,并且不会在每次调用函数时用初始起始值覆盖它
尝试初始化为
None
的类变量。这是Python中的标准习语,在许多其他语言中有直接同源词导入时间
输出:
第二次调用不会更改最初保存的时间
相关问题 更多 >
编程相关推荐