关于循环:将值重新分配给python中函数内的变量

Reassigning value to a variable inside a function in python

本问题已经有最佳答案,请猛点这里访问。

我想运行一个无限循环,每100个循环我都要打印一次。如果我这样做:它工作得很好,

1
2
3
4
5
6
7
8
delay=0

while 1:
delay=delay+1
print(delay)
if delay>100:
    delay=0
    print('100th time')

但是,如果我将if语句放在函数中,它会给出错误:

1
2
3
4
5
6
7
8
9
delay=0
def foo():
    if delay>100:
        delay=0
        print('100th time')
while 1:
    delay=delay+1
    print(delay)
    foo()

错误为:未绑定的本地错误:分配前引用了本地变量"delay"。

我是否可以在函数中重新分配?把整个事情放到while循环中对我来说是个问题。


如果不想将delay作为参数传递给foo,可以使用global。但最好这样做。另请阅读:为什么全局变量是邪恶的?

1
2
3
4
5
6
7
8
9
10
delay=0
def foo():
    global delay
    if delay>100:
        delay=0
        print('100th time')
while 1:
    delay=delay+1
    print(delay)
    foo()


向功能和使用模块传递延迟(%):

1
2
3
4
5
6
7
8
9
delay=0
def foo(delay):
    if delay % 100 == 0:
        print('100th time')

while True:
    delay=delay+1
    print(delay)
    foo(delay)

当存在其他有效的解决方案时,始终避免使用global。它们显著增加了代码的复杂性。


您可以在函数内部使用global声明,如下所示:

1
2
3
4
5
6
7
8
9
10
delay=0
def foo():
    global delay
    if delay>100:
        delay=0
        print('100th time')
while 1:
    delay=delay+1
    print(delay)
    foo()

在这种情况下,您还可以通过传递函数foo()中的值来避免global,并像delay = (delay + 1) % 100一样重新分配delay

1
2
3
4
5
6
7
8
9
delay=1
def foo(delay):
    if delay == 0:
        print('100th time')
while True:
    delay = delay + 1
    print(delay)
    foo(delay)
    delay = delay % 100