python的一个语法“陷阱”

本文从WordPress迁移而来, 查看全部WordPress迁移文章

在threading模块的时候遇到的一个问题

1
tempThread = threading.Thread(target = Func  , args = (something))

这个语句创建了一个线程,线程函数是Func,需要的参数在在一个元组中 (something)

运行是发现了一个奇怪的报错,说Func是只接收1个参数,但传递了20个过去

后来才发现,something是我要传过去的字符串,刚好是20个字符,但python把它看做20个单个字符,传了过去

其实这也不算是什么“语法陷阱”,主要是对元组不熟悉,而且第一次遇到这种情况的话,大多数人难免会觉得诡异

在python中,传递一个函数指针(target = Func , Func其实就是个函数指针),然后用一个元组,把需要的参数也一并传过去的方式是很多的,例如常用又好用的 apply 函数

如果参数列表是空的,直接 args=()

如果参数列表的参数有2个或以上,直接 args= (a1,a2)

然后只有一个参数的时候,就要注意了,args = (a1 , )

如果是 args = (a1) , python会把a1解释为一个元组,如果a1是个字符串,就解释为一个一个的字符(单个字符的字符串),并视为元组中的一项,同理,如果a1是个列表,本来是想传递一个列表过去(一个参数),但是这个列表被解释为一个一个元组,列表中每个项被视为一个参数,等同于传递了多个参数过去