在循环函数中仅创建一次变量

2024-09-29 21:25:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个经常循环的函数。 在它里面,我想创建一个变量,然后将不断增加。 我的问题是,当我在函数中定义它时,它会被新的迭代覆盖,从而使它的使用无效

所以我只想定义它一次,不管它循环的频率有多高。但也许还有另一种解决办法

我的代码和变量是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()

Tags: 函数inselflenif定义timearray
3条回答

如果要使用全局变量,可以在函数顶部使用global aniTime在函数中使用它

最佳实践可能是将变量保存在调用函数的循环之外,并且可以将其作为参数传递到函数中

尝试在任何函数之外定义变量,将其调用到函数中,然后在每次使用后从函数返回

var = 1

def example(var):
    #insert program code
    var += 1
    return var

var = example(var)

这将使每次运行“示例”函数时,“var”都被传递到其中,然后返回,增加1。每次在程序运行时使用此函数时,变量“var”将增加1

在这种情况下,您可以将我用作“aniTime”变量示例的“var”变量替换为“aniTime”,您只需在函数之前定义一次,并且不会在每次调用函数时用初始起始值覆盖它

尝试初始化为None的类变量。这是Python中的标准习语,在许多其他语言中有直接同源词

导入时间

class Foo():

    aniTime = None

    def animate(self):
        if Foo.aniTime is None:
            Foo.aniTime = time.time()

food = Foo()
food.animate()
print(food.aniTime)
time.sleep(2)
 
fool = Foo()
fool.animate()
print(fool.aniTime)

输出:

1603149209.5965674
1603149209.5965674

第二次调用不会更改最初保存的时间

相关问题 更多 >

    热门问题