如果从 python 中的另一个函数调用,if 语句值在循环中不会改变

if statement value not changing in loop if called from another function in python

那里。我正在创建一个程序,运行 遇到了一个让我和我对基本代码的理解(或者我对我的视力的理解)感到困惑的问题。

根据我的说法,这段代码应该打印出来

Test

当程序启动时,然后当从定时器线程调用 ext() 时,循环变量将立即变为 False,本质上是在 if 语句上返回 false 并且不会继续打印出来 'Test'.

但是即使调用了 ext()(我对此进行了测试),if 语句继续被调用并且循环不会更改为 False。

from threading import Timer, Thread
from time import sleep

loop = True

def hello():
    while True:
        if loop == True:
            print('Test')
            sleep(0.5)

def ext():
    loop = False

th = Thread(target=hello)
th.start()

t = Timer(5, ext())
t.start()

请帮忙,因为我已经为此困了几个小时。

您需要将 loop 指定为全局变量。在 ext() 中,它认为您正在定义一个名为 loop 的新变量,而您实际上想要修改全局变量。所以正确的代码应该是这个:

from threading import Timer, Thread
from time import sleep

loop = True

def hello():
    while True:
        if loop == True:
            print('Test')
            sleep(0.5)

def ext():
    global loop
    loop = False

th = Thread(target=hello)
th.start()

t = Timer(5, ext)
t.start()

您还需要更改最后一行之前的那个而不是调用 ext 将其传递给 Timer

你有两个问题……好吧,真的是三个。首先,ext 引用了一个名为 loop 的局部变量,而不是全局变量。其次,您并没有真正启动线程,因为您调用了函数而不是传入它的引用。第三...当 loop 设置时你不再睡觉,所以你的代码最终会在一个紧密的循环中吃掉一个完整的 cpu。修复前两个将是

from threading import Timer, Thread
from time import sleep

loop = True

def hello():
    while True:
        if loop == True:
            print('Test')
            sleep(0.5)

def ext():
    global loop
    loop = False

th = Thread(target=hello)
th.start()

t = Timer(5, ext)
t.start()