下面是從python ?threading模塊摘錄下來的
class threading.Thread(group=None, target=None,
name=None, args=(), kwargs={})
args is the argument tuple for the target invocation. Defaults to
().
kwargs is a dictionary of keyword arguments for the target
invocation. Defaults to {}.
簡單的說就是,線程函數的參數要麽是tuple類型要麽是dict類型,既然python文檔上已經規定好了,那麽就是不能變了,除非重大的版本升級,棄用現在這種方式,不過這是不可能的,再者可以查看threading.Thread類的初始化代碼
class?Thread(_Verbose):def?__init__(self,?group=None,?target=None,?name=None,
args=(),?kwargs=None,?verbose=None):assert?group?is?None,?"group?argument?must?be?None?for?now"
_Verbose.__init__(self,?verbose)
if?kwargs?is?None:
kwargs?=?{}
self.__target?=?target
self.__name?=?str(name?or?_newname())
self.__args?=?args
self.__kwargs?=?kwargs
self.__daemonic?=?self._set_daemon()
self.__ident?=?None
self.__started?=?Event()
self.__stopped?=?False
self.__block?=?Condition(Lock())
self.__initialized?=?True
#?sys.stderr?is?not?stored?in?the?class?like
#?sys.exc_info?since?it?can?be?changed?between?instances
self.__stderr?=?_sys.stderr
看到上面的args和kwargs的賦值情況嗎,妳不能像**kwargs這樣來傳參的。
從上面來看,妳要使用多線程妳就必須遵守這個約定,線程函數參數要麽是tuple,要麽是字典,沒辦法改進。非要改進那就是使用全局變量,不用傳參,但是如果是這樣的話會涉及到線程安全的問題或者叫數據同步問題,如果不加鎖或者其他互斥量的話這個問題會很嚴重。所以還是遵守規定吧