You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在def()中声明变量且仅初始化一次?按键切换输出问题求解

解决方案

你的核心问题是需要让var1仅在程序启动时初始化一次,同时避免循环中被重复重置,还要解决按键重复触发的问题。以下是几种可行的实现方式:

方法1:使用函数默认参数(推荐,无全局变量)

函数的默认参数只会在函数定义时初始化一次,刚好满足var1仅首次初始化的需求,同时通过状态变量避免按键按住时重复输出:

from win32api import GetKeyState
import threading
import time

def key_down(key):
    # GetKeyState按下按键时返回负数,此判断更准确
    return GetKeyState(key) < 0

def starter(var1=100, insert_pressed=False):
    while True:
        current_state = key_down(0x2D)
        # 仅当按键从抬起变为按下时触发逻辑
        if current_state and not insert_pressed:
            print("pressed INSERT")
            print(var1)
            # 交替切换值
            var1 = 144 if var1 == 100 else 100
            insert_pressed = True
        # 按键抬起时重置状态标记
        elif not current_state:
            insert_pressed = False
        time.sleep(0.02)

def in_new_thread():
    th = threading.Thread(target=starter)
    th.start()

in_new_thread()

方法2:使用全局变量

如果偏好全局变量的方式,需要在函数内用global声明变量,确保修改的是全局变量而非局部变量:

from win32api import GetKeyState
import threading
import time

# 全局变量仅初始化一次
var1 = 100
insert_pressed = False

def key_down(key):
    return GetKeyState(key) < 0

def starter():
    global var1, insert_pressed
    while True:
        current_state = key_down(0x2D)
        if current_state and not insert_pressed:
            print("pressed INSERT")
            print(var1)
            var1 = 144 if var1 == 100 else 100
            insert_pressed = True
        elif not current_state:
            insert_pressed = False
        time.sleep(0.02)

def in_new_thread():
    th = threading.Thread(target=starter)
    th.start()

in_new_thread()

方法3:使用闭包保存状态

通过闭包封装状态变量,避免全局变量和默认参数的局限:

from win32api import GetKeyState
import threading
import time

def key_down(key):
    return GetKeyState(key) < 0

def create_starter():
    # 闭包内的变量仅初始化一次
    var1 = 100
    insert_pressed = False
    def starter():
        nonlocal var1, insert_pressed
        while True:
            current_state = key_down(0x2D)
            if current_state and not insert_pressed:
                print("pressed INSERT")
                print(var1)
                var1 = 144 if var1 == 100 else 100
                insert_pressed = True
            elif not current_state:
                insert_pressed = False
            time.sleep(0.02)
    return starter

def in_new_thread():
    starter_func = create_starter()
    th = threading.Thread(target=starter_func)
    th.start()

in_new_thread()

内容的提问来源于stack exchange,提问作者devinoff_x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:31:00