如何向Thread创建函数传递list列表和dictionary字典参数
Python线程传递列表/字典参数的正确实现方式
原代码核心错误点
- 参数传递逻辑不匹配:
Thread的args参数用于传递位置参数,对应目标函数的位置形参/*args,如果目标函数定义了**kwargs接收关键字参数,需要使用Thread的kwargs参数传值 - 参数语法错误:
args要求传入元组类型,(args=mylist)的写法不符合语法规范,args是Thread的顶层参数,不需要嵌套括号 - 取值逻辑错误:
kwargs.values是字典的内置方法,需要加括号调用kwargs.values()才能拿到值集合,且如果只传单个对象不需要用**kwargs接收,直接用普通形参更简洁
推荐实现(普通形参接收,无需关键字参数)
from threading import Thread # 直接定义形参接收传入的列表 def expectslist(received_list): # 此处received_list就是传入的mylist,可直接使用 for item in received_list: print(item) # 直接定义形参接收传入的字典 def expectsdict(received_dict): # 此处received_dict就是传入的mydict,可直接使用 for k, v in received_dict.items(): print(f"key:{k}, value:{v}") def main(): mylist = [1, 2, 3, 4] # 示例列表 mydict = {"a":1, "b":2, "c":3} # 示例字典 # args必须传元组,单个参数末尾要加逗号,避免被识别为普通括号 thread1 = Thread(target=expectslist, args=(mylist,)) thread2 = Thread(target=expectsdict, args=(mydict,)) thread1.start() thread2.start() thread1.join() thread2.join() if __name__ == "__main__": main()
关键字参数接收实现(如需使用**kwargs场景)
from threading import Thread def expectslist(**kwargs): # 按传入的key取对应的列表对象 received_list = kwargs.get("input_list") for item in received_list: print(item) def expectsdict(**kwargs): # 按传入的key取对应的字典对象 received_dict = kwargs.get("input_dict") for k, v in received_dict.items(): print(f"key:{k}, value:{v}") def main(): mylist = [1, 2, 3, 4] mydict = {"a":1, "b":2, "c":3} # 用Thread的kwargs参数传递字典格式的关键字参数 thread1 = Thread(target=expectslist, kwargs={"input_list": mylist}) thread2 = Thread(target=expectsdict, kwargs={"input_dict": mydict}) thread1.start() thread2.start() thread1.join() thread2.join() if __name__ == "__main__": main()
注意:
args传递单个参数时必须加末尾的逗号,比如(mylist,),否则Python会把括号识别为运算优先级符号,不会识别为元组,导致传参错误。
内容的提问来源于stack exchange,提问作者Pankaj Bhide
相关产品推荐
相关产品推荐

