Python threading.Thread传元组遇TypeError:为何普通元组无法正确传递?
问题解析:threading.Thread的args参数传递误区
为什么直接传('Cats', 'Dogs', 'Tigers')会报错?
threading.Thread的args参数是用来存放传给目标函数的所有位置参数的元组,它会自动把元组里的每个元素拆出来,依次作为目标函数的位置参数。
你的代码里,当args=('Cats', 'Dogs', 'Tigers')时,线程实际会这样调用fun:
fun('Cats', 'Dogs', 'Tigers', sep=' & ')
但你的fun函数只定义了一个位置参数args,突然收到3个位置参数,自然触发TypeError。
为什么(('Cats', 'Dogs', 'Tigers'),)能正常运行?
这个写法是一个只包含单个元素的元组,这个元素就是你要传给fun的args参数的元组。此时线程会把这个单个元素作为唯一的位置参数传给fun,相当于:
fun(('Cats', 'Dogs', 'Tigers'), sep=' & ')
这完全符合fun的参数定义(一个位置参数+关键字参数),所以能正常执行。
总结
threading.Thread的args本质是目标函数的位置参数列表的元组形式,不是直接传递给目标函数第一个参数的值。如果要把一个容器(比如元组)作为单个参数传给目标函数,必须把它再嵌套一层,变成单元素元组。
内容的提问来源于stack exchange,提问作者Navdeep
相关产品推荐
相关产品推荐

