如何在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
相关产品推荐
相关产品推荐

